打算自己封装一个Redis操作类,方便使用,且有一定log记录。
Redis的封装思路:
基于Redis类进一步封装

一般属性

单例 (配置参数从配置文件中读取还是写死?考虑多配置之间切换)

常规操作根据业务单独处理。(注意健壮性和容错)

目的不同,可能做的封装也同。
我们要基于业务做一些抽象程度较低的封装,也会根据需要,做一些tool级别的高抽象的封装。如果抽象的足够高,可以让通用性变得更好。
这次封装Redis,我先做一个通用性的Redis操作类,先仅作最基本的一些操作。

代码如下:

<?php
/**
* Created by PhpStorm.
* User: freephp
* Date: 2016/1/4
* Time: 11:09
*/ class MyRedis extends Redis { public static $instance = null; // 单例对象 public $isConnect = false; // 判断redis是否链接成功 public $connectMsg = ''; // redis链接信息 public $date = null; // log记录日期 private $config = [
//主(master)服务器
'master' => [
'hostname' => '192.168.1.223',
'password' => 'sewerew',
'port' => '6379',
'timeout' => '5',
],
//从(slave)服务器
'slave' => [
'hostname' => '192.168.1.230',
'password' => 'qweqq',
'port' => '6379',
'timeout' => '5',
]
]; function __construct($params = array()) {
parent::__construct();
$serverArray = $this->config; //组装参数
$hostname = $serverArray['master']['hostname']; //连接地址
$password = $serverArray['master']['password']; //密码
$port = $serverArray['master']['port']; //端口
$timeout = $serverArray['master']['timeout']; //超时
//选择用户指定的主机和数据库
if (isset($params['redis']) && array_key_exists($params['redis'], $serverArray)) {
$hostname = $serverArray[$params['redis']]['hostname']; //连接地址
$password = $serverArray[$params['redis']]['password']; //密码
$port = $serverArray[$params['redis']]['port']; //端口
$timeout = $serverArray[$params['redis']]['timeout']; //超时
}
$this->date = date('Y-m-d', time()); $this->_connect($hostname, $port, $timeout, $password);
} /**
* 连接数据库
*
* @param string $hostname 主机地址
* @param int $port redis端口
* @param int $timeout 超时时间默认30s
* @param string $password 验证密码
* @param bool $isPConnect 是否长连接:默认false非长连接
* @return bool 返回值:成功返回true,失败false
*/
private function _connect($hostname, $port = 6379, $timeout = 5, $password = '', $isPConnect = false) {
//开始连接数据库
try {
if ($isPConnect == false) {
$status = $this->connect($hostname, $port, $timeout);
} else {
$status = $this->pconnect($hostname, $port, $timeout);
} if (!$status) {
error_log(date('Y-m-d H:i:s') . ":" . 'redis connect error' . "\t",3, "./application/logs/redis-error-{$this->date}.log");
return $this->response(false, 'redis connect error');
}
} catch (Exception $e) {
error_log(date('Y-m-d H:i:s') . ":" . $e->getMessage() . "\t",3, "./application/logs/redis-error-{$this->date}.log");
return $this->response(false, $e->getMessage());
} //验证密码
if ($password && !$this->auth($password)) {
error_log(date('Y-m-d H:i:s') . ":" . 'redis password error' . "\t",3, "./application/logs/redis-error-{$this->date}.log");
return $this->response(false, 'redis password error');
} return $this->response(true, 'redis connect success');
} public static function getInstance($params = array(), $flag = false) {
if (!(self::$instance instanceof self) || $flag) {
self::$instance = new self($params = array());
}
return self::$instance;
} /**
* 返回消息
*
* @param bool $status 状态
* @param string $msg 消息
* @return void
*/
private function response($status = false, $msg = '') {
$this->isConnect = $status; //判断redis是否连接成功
$this->connectMsg = $msg; //连接redis的消息通知
return $status;
} }

// 调用
$myredis = new MyRedis(); var_dump($myredis->connectMsg);die();

我们基于更详细业务做的其他封装类可以使用这个MyRedis作为一个注入类,多用组合,实现解耦。

写一个Redis封装类的更多相关文章

  1. 用 C# 写一个 Redis 数据同步小工具

    用 C# 写一个 Redis 数据同步小工具 Intro 为了实现 redis 的数据迁移而写的一个小工具,将一个实例中的 redis 数据同步到另外一个实例中.(原本打算找一个已有的工具去做,找了一 ...

  2. 学习T-io框架,从写一个Redis客户端开始

    前言   了解T-io框架有些日子了,并且还将它应用于实战,例如 tio-websocket-server,tio-http-server等.但是由于上述两个server已经封装好,直接应用就可以.所 ...

  3. 徒手用 Go 写个 Redis 服务器(Godis)

    作者:HDT3213 今天给大家带来的开源项目是 Godis:一个用 Go 语言实现的 Redis 服务器.支持: 5 种数据结构(string.list.hash.set.sortedset) 自动 ...

  4. python_way ,day11 线程,怎么写一个多线程?,队列,生产者消费者模型,线程锁,缓存(memcache,redis)

    python11 1.多线程原理 2.怎么写一个多线程? 3.队列 4.生产者消费者模型 5.线程锁 6.缓存 memcache redis 多线程原理 def f1(arg) print(arg) ...

  5. 【原创】自己动手写一个能操作redis的客户端

    引言 redis大家在项目中经常会使用到.官网也提供了多语言的客户端供大家操作redis,如下图所示 但是,大家有思考过,这些语言操作redis背后的原理么?其实,某些大神会说 只要按照redis的协 ...

  6. 用.netcore写一个简单redis驱动,调试windows版本的redis.平且给set和get命令添加参数.

    1. 下载windows版本的redis 2.开发环境vs2017  新建一个 .net core控制台. private static Socket socket = new Socket(Addr ...

  7. 搞定redis面试--Redis的过期策略?手写一个LRU?

    1 面试题 Redis的过期策略都有哪些?内存淘汰机制都有哪些?手写一下LRU代码实现? 2 考点分析 1)我往redis里写的数据怎么没了? 我们生产环境的redis怎么经常会丢掉一些数据?写进去了 ...

  8. 【redis前传】自己手写一个LRU策略 | redis淘汰策略

    title: 自己手写一个LRU策略 date: 2021-06-18 12:00:30 tags: - [redis] - [lru] categories: - [redis] permalink ...

  9. 盘点一下Redis中常用的Java客户端,或者咱们手写一个?

    Java中那些Redis的客户端 前面我们的所有操作都是基于redis-cli来完成的,那么我们要在Java中操作Redis,怎么做呢?首先我们先来了解一下Redis Serialization Pr ...

随机推荐

  1. javascript2

    代码变化一:<script> function abs(){ var x; if(x>0){ return x; } else{ return -x; } } console.log ...

  2. EA强大的绘图工具---设计数据库表格

    关于EA这个优秀的软件是从师哥哪里听来的,自己瞎点了点,感觉也没什么.近期和和智福加上一个师哥合作敲机房收费系统时,想到之前听人说EA非常强大,便随便找了找关于EA使用的帮助手冊.果然惊喜-- 如题, ...

  3. centos6的安装

      centos6的安装,一步一图,有图有真相     打开虚拟机VMware,点击文件,选择[新建虚拟机],如图所示

  4. 算法课上机实验(一个简单的GUI排序算法比较程序)

    (在家里的电脑上Linux Deepin截的图,屏幕大一点的话,deepin用着还挺不错的说) 这个应该是大二的算法课程上机实验时做的一个小程序,也是我的第一个GUI小程序,实现什么的都记不清了,只记 ...

  5. JavaScript精彩范例(1)——Jquery EasyUI应用的一个框架实例

    从网上看到的,非常漂亮,放在这里和大家分享一下,作者是疯狂秀才 这是截图 >>这是下载地址<<

  6. hibernate 获取实体的表名、主键名、列名(转载+修改)

    package com.escs.utils; import java.util.Iterator; import org.hibernate.cfg.AnnotationConfiguration; ...

  7. SZU:G34 Love code

    Judge Info Memory Limit: 32768KB Case Time Limit: 10000MS Time Limit: 10000MS Judger: Normal Descrip ...

  8. Spectral Clustering

    谱聚类算法(Spectral Clustering)优化与扩展   谱聚类(Spectral Clustering, SC)在前面的博文中已经详述,是一种基于图论的聚类方法,简单形象且理论基础充分,在 ...

  9. JVM内存划分

    JVM内存划分吗? 前言: 大家都知道虚拟机,都知道JVM,其实这些都是基于sun公司[oracle公司]的HotSpot虚拟机,当然本篇博文也是以sun公司为基础.还有其他的虚拟机,常见的就有JRo ...

  10. 企业架构研究总结(30)——TOGAF架构内容框架之内容元模型(上)

    2. 内容元模型(Content Metamodel) 在TOGAF的眼中,企业架构是以一系列架构构建块为基础的,并将目录.矩阵和图形作为其具体展现方式.如果我们把这些表述方式看作为构建块的语法,那么 ...