写一个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 ...
随机推荐
- log4e插件的安装和使用
1.首先下载log4e小工具.放入myeclipse10安装文件夹D:\Program Files (x86)\myEclipse10\MyEclipse Blue Edition 10\dropin ...
- 如何判断微信内置浏览器(通过User Agent实现)
在进行微信公众账号开发的时候,其中很大一块是微站点的开发,我们需要知道当前的浏览器是微信内置的浏览器,那么如何判断呢? 微信内置浏览器的 User Agent 如何判断微信内置浏览器,首先需要获取微信 ...
- jmeter 控制器
Critical Section Controller :
- WCF中队列服务详解
WCF中队列服务详解 一.引言 在前面的WCF服务中,它都要求服务与客户端两端都必须启动并且运行,从而实现彼此间的交互.然而,还有相当多的情况希望一个面向服务的应用中拥有离线交互的能力.WCF通过服务 ...
- javascript面向对象2
原文:javascript面向对象2 首先我们先创建一个对象 var user = Object(); user.name = "张三"; user.age = 20; user. ...
- Nhibernate分页测试续
Nhibernate分页测试续(附源码) 接着上一篇Nhibernate分页测试,最近一直在接触Nhibernate,接触的越多.了解越深,越是感觉他的强大,很多功能都封装的很好,对数据操作是那么的简 ...
- Introducing ASP.NET vNext and MVC 6
[译]Introducing ASP.NET vNext and MVC 6 原文:http://www.infoq.com/news/2014/05/ASP.NET-vNext?utm_source ...
- Weapsy 分析网站架构
Weapsy 分析(一)网站架构 这个项目看了好久了,但是老没时间写一些分析心得.下班后想了想,事情也不能老拖着,还是得做. 如图所示:Weapsy由5个项目所组成,有点可惜了,没有测试的项目,说明一 ...
- Smith Numbers - PC110706
欢迎访问我的新博客:http://www.milkcu.com/blog/ 原文地址:http://www.milkcu.com/blog/archives/uva10042.html 原创:Smit ...
- JobTracker等相关功能模块初始化
[Hadoop代码笔记]Hadoop作业提交之JobTracker等相关功能模块初始化 一.概要描述 本文重点描述在JobTracker一端接收作业.调度作业等几个模块的初始化工作.想过模块的介绍会在 ...