写一个Redis封装类
打算自己封装一个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封装类的更多相关文章
- 用 C# 写一个 Redis 数据同步小工具
用 C# 写一个 Redis 数据同步小工具 Intro 为了实现 redis 的数据迁移而写的一个小工具,将一个实例中的 redis 数据同步到另外一个实例中.(原本打算找一个已有的工具去做,找了一 ...
- 学习T-io框架,从写一个Redis客户端开始
前言 了解T-io框架有些日子了,并且还将它应用于实战,例如 tio-websocket-server,tio-http-server等.但是由于上述两个server已经封装好,直接应用就可以.所 ...
- 徒手用 Go 写个 Redis 服务器(Godis)
作者:HDT3213 今天给大家带来的开源项目是 Godis:一个用 Go 语言实现的 Redis 服务器.支持: 5 种数据结构(string.list.hash.set.sortedset) 自动 ...
- python_way ,day11 线程,怎么写一个多线程?,队列,生产者消费者模型,线程锁,缓存(memcache,redis)
python11 1.多线程原理 2.怎么写一个多线程? 3.队列 4.生产者消费者模型 5.线程锁 6.缓存 memcache redis 多线程原理 def f1(arg) print(arg) ...
- 【原创】自己动手写一个能操作redis的客户端
引言 redis大家在项目中经常会使用到.官网也提供了多语言的客户端供大家操作redis,如下图所示 但是,大家有思考过,这些语言操作redis背后的原理么?其实,某些大神会说 只要按照redis的协 ...
- 用.netcore写一个简单redis驱动,调试windows版本的redis.平且给set和get命令添加参数.
1. 下载windows版本的redis 2.开发环境vs2017 新建一个 .net core控制台. private static Socket socket = new Socket(Addr ...
- 搞定redis面试--Redis的过期策略?手写一个LRU?
1 面试题 Redis的过期策略都有哪些?内存淘汰机制都有哪些?手写一下LRU代码实现? 2 考点分析 1)我往redis里写的数据怎么没了? 我们生产环境的redis怎么经常会丢掉一些数据?写进去了 ...
- 【redis前传】自己手写一个LRU策略 | redis淘汰策略
title: 自己手写一个LRU策略 date: 2021-06-18 12:00:30 tags: - [redis] - [lru] categories: - [redis] permalink ...
- 盘点一下Redis中常用的Java客户端,或者咱们手写一个?
Java中那些Redis的客户端 前面我们的所有操作都是基于redis-cli来完成的,那么我们要在Java中操作Redis,怎么做呢?首先我们先来了解一下Redis Serialization Pr ...
随机推荐
- 安卓MonkeyRunner源码分析之工作原理架构图及系列集合
花了点时间整理了下MonkeyRunner的工作原理图,请配合本人博客里面MonkeyRunner其他源码分析文章进行阅读.下面整理成相应系列列表方便大家阅读: MonkeyRunner源码分析之-谁 ...
- appium之java API(2)
TouchAction AppiumDriver的辅助类,主要针对手势操作,比方滑动.长按.拖动等.TouchAction的原理是讲一系列的动作放在一个链条中,然后将该链条传递给server.serv ...
- 使用Scala操作Mongodb
介绍 Scala是一种功能性面向对象语言.它融汇了很多前所未有的特性.而同一时候又执行于JVM之上.随着开发人员对Scala的兴趣日增,以及越来越多的工具支持,无疑Scala语言将成为你手上一件不可缺 ...
- CI框架 .htaccess 隐藏url在index.php解决方案
CodeIgniter(下面简称"CI")是一款国外优秀的PHP轻量级MVC框架,它支持PHP4和PHP5.是开发中小型可拓展性需求高的Web应用程序的利器.眼下你所见到的这个博客 ...
- VMware7安装CentOS6.5教程
VMware7安装CentOS6.5教程 http://www.91linux.com/html/2014/CentOS_0415/9727.html工欲善其事,必先利其器.学习linux系统,必须先 ...
- Oracle中注意用户的访问权限
新增表.序列.存储过程等,要注意用户(例如System)的权限.如果在增删改查过程中出现数据库读写权限的报错,则在建表(或者序列.存储过程等)时,在脚本前面加 GRANT CREATE TABLE T ...
- 求最短路径算法之SPAF算法。
关于求最短路径: 求最短路径的算法有许多种,除了排序外,恐怕是OI界中解决同一类问题算法最多的了.最熟悉的无疑是Dijkstra(不能求又负权边的图),接着是Bellman-Ford,它们都可以求出由 ...
- LINUX SCP 远程 文件 复制
首先,以确保直接两个机器IP可以在每个ping通过 然后使用SCP命令从第一台主机向第二台主机复制文件 scp src chiwei@192.168.8.144:/home/chiwei/mydisk ...
- 加密算法 MD5/SHA1
近来想学习函数式编程. 但是一直不知道怎么展开这个学习过程,目前的研究进度也不深入,想讲解一些原理也无从下手. 先简单的上一些算法,逐步分析语法和思想.虽然程度不深,但至少能记录这个过程. 本例子用F ...
- iOS基础 - CALayer
一.CALayer简介 Core Animation是跨平台的,支持iOS环境和Mac OS X环境 凡是支持跨平台的框架,都不能直接使用UIKit框架,因为UIKit框架只能应用在iOS而不能用于M ...