打算自己封装一个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. 为网上流行论点“UIAutomator不能通过中文文本查找控件”正名

    1. 问题描述和起因 相信大家学习UIAutomator一开始的时候必然会看过一下这篇文章. Android自动化测试(UiAutomator)简要介绍 因为你在百度输入UIAutomator搜索的时 ...

  2. linux内核的冒险md来源释义# 14raid5非条块读

    linux内核的冒险md来源释义# 14raid5非条块读 转载请注明出处:http://blog.csdn.net/liumangxiong 假设是非条块内读.那么就至少涉及到两个条块的读,这就须要 ...

  3. SQL点滴28—一个简单的存储过程

    原文:SQL点滴28-一个简单的存储过程 在表中写入一条数据同事要向另外一个表中写入信息,所以会使用到事务.实际使用的时候还会一次向一个表中吸入多条数据,下面的存储过程,将字符串拆分成数组然后写入到表 ...

  4. WebApi 插件式构建方案

    WebApi 插件式构建方案 WebApi 插件式构建方案 公司要推行服务化,不可能都整合在一个解决方案内,因而想到了插件式的构建方案.最终定型选择基于 WebApi 构建服务化,之所以不使用 WCF ...

  5. 笔试题&amp;面试题:CW输出矩阵

    称号:CW输出矩阵(N*N). 如果一个矩阵: 1   2   3   4 5   6   7   8 9  10 11 12 13 14 15 16 那么程序应该给出的输出为:1 2 3 4 8 1 ...

  6. Java Persistence with MyBatis 3(中国版)

    译者的话 前段时间因为工作和学习的须要,我打算深入研究MyBatis框架.于是在网上查找关于MyBatis的教程,发现国内网上关于MyBatis的教程资料少得可怜:除了MyBatis官网上的用户使用手 ...

  7. 松瀚SN8P2711 2722 ADC初始化程序及应用--汇编源码

    /* 松瀚 SN8P2711 2722 ADC初始化程序 及应用实例 */ INIT_ADC: MOV A, #0XB2 // 启动ADC电路 使能AIN通道 B0MOV ADM, A MOV A,# ...

  8. 代码阅读软件kscope源码安装指导

    安装 kscope-1.6.2 1. ./configure --without-arts --prefix=/soft/kscope-1.6.2  (I customize the installi ...

  9. [置顶] Hibernate从入门到精通(十)多对多单向关联映射

    上一篇文章Hibernate从入门到精通(九)一对多双向关联映射中我们讲解了一下关于一对多关联映射的相关内容,这次我们继续多对多单向关联映射. 多对多单向关联映射 在讲解多对多单向关联映射之前,首先看 ...

  10. 浅谈DevExpress<二>:设计一个完整界面(2)

    下面来把剩下的工作做完,换肤功能昨天已近讨论过,今天就不重复了.首先建立三个全局变量,一个存放文件路径,一个存放数据,一个存放过滤条件. string DBFileName; DataView dat ...