php redis 分布式类
配置:
$redis_config = array(
'prefix' => 'ylmall_',
'master' => array(
'host' => "192.168.1.19",
'port' => "6379",
)
);
类文件:
class cls_redis {
/**
*
* @var $_configMaster master config,default to empty array
*/
private $_configMaster = array (); /**
*
* @var $_configSlave slave config,default to empty array
*/
private $_configSlave = array (); /**
*
* @var $_redisKeyPrefix the redis key prefix
*/
private $_redisKeyPrefix = '';
private $debug = false;
public $queries = array (); /**
*
* @ignore
*
*/
function __construct($redis_config) {
$this->_configMaster = $redis_config ['master'];
// $this->_configSlave = $redis_config['slave'];
$this->_redisKeyPrefix = $redis_config ['prefix'];
} /**
* Get redis key prefix
*
* @return string
*/
public function getKeyPrefix() {
return $this->_redisKeyPrefix;
} /**
* Set redis key prefix
*
* @return
*
*/
public function setKeyPrefix($prefix) {
$this->_redisKeyPrefix = $prefix;
} /**
*
* @var $_redisMaster redis master,default to null
*/
private $_redisMaster = null; /**
* Get redis master server.If fail,throw ErrorException.
*
* @return Redis
*/
public function getRedisMaster() {
if ($this->_redisMaster instanceof Redis) {
return $this->_redisMaster;
} else {
$this->_redisMaster = new Redis ();
try {
$this->_redisMaster->connect ( $this->_configMaster ['host'], $this->_configMaster ['port'] );
$this->_redisMaster->setOption ( Redis::OPT_PREFIX, $this->_redisKeyPrefix );
} catch ( Exception $e ) {
// $this->errorShow ();
throw new ErrorException ( "Connect redis server " . implode ( ",", $this->_configMaster ) . " fail !" );
}
return $this->_redisMaster;
}
}
/**
*
* @var $_redisSlave redis slave,default to null
*/
private $_redisSlave = null; /**
* Get redis salve server.If fail,throw a ErrorException.
*
* @return Redis
*/
public function getRedisSlave() {
if ($this->_redisSlave instanceof Redis) {
return $this->_redisSlave;
} else {
$this->_redisSlave = new Redis ();
try {
// $this->_redisSlave->connect($this->_configSlave['host'], $this->_configSlave['port']);
// $this->_redisSlave->setOption(Redis::OPT_PREFIX, $this->_redisKeyPrefix);
$this->_redisSlave->connect ( $this->_configMaster ['host'], $this->_configMaster ['port'] );
$this->_redisSlave->setOption ( Redis::OPT_PREFIX, $this->_redisKeyPrefix );
} catch ( Exception $e ) {
// $this->errorShow();
// throw new ErrorException("Connect redis server " . implode(",", $this->_configSlave) . " fail !");
$this->errorShow ();
throw new ErrorException ( "Connect redis server " . implode ( ",", $this->_configMaster ) . " fail !" );
} return $this->_redisSlave;
}
} /**
*
* @var $_cmdScopeMaster master sever command scope
*/
private static $_cmdScopeMaster = array (
'multi',
'exec',
'discard',
'watch',
'unwatch',
// key - value structure
'setex',
'psetex',
'setnx',
'del',
'delete',
'incr',
'incrBy',
'incrByFloat',
'decr',
'decrBy',
// list structrue
'lPush',
'rPush',
'lPushx',
'rPushx',
'lSet',
'lRem',
'lRemove',
'lInsert',
'lTrim',
'listTrim',
// set structrue
'sAdd',
'sRem',
'sRemove',
'sMove',
'sPop',
// hash structrue
'hSet',
'hSetNx',
'hDel',
'hIncrBy',
'hIncrByFloat',
'hMset',
// transaction
'multi',
'exec',
// sorted set structrue
'zAdd',
'zDelete',
'zDeleteRangeByRank',
'zCount',
'zRange',
'zRangeByScore',
'expire',
// server
'info'
); /**
* set master server commadn scope
*
* @param array $cmds
* @return void
*/
public function setCmdScopeMaster(array $cmds) {
self::$_cmdScopeMaster = array_unique ( array_merge ( self::$_cmdScopeMaster, $cmds ) );
} /**
*
* @var $_cmdScopeSlave slave sever command scope
*/
private static $_cmdScopeSlave = array (
// key - value structure
'exists',
'mGet',
'getMultiple',
// list structure
'lPop',
'rPop',
'blPop',
'brPop',
'lSize',
'lIndex',
'lGet',
'lRange',
'lGetRange',
// set structrue
'sIsMember',
'sContains',
'sCard',
'sSize',
'sRandMember',
'sMembers',
// hash structrue
'hGetAll',
'hGet',
'hLen',
'hKeys',
'hVals',
'hExists',
'hMGet',
// sorted set structrue
'zRevRange',
'zRevRangeByScore'
); /**
* set slave server commadn scope
*
* @param array $cmds
* @return void
*/
public function setCmdScopeSlave(array $cmds) {
self::$_cmdScopeSlave = array_unique ( array_merge ( self::$_cmdScopeSlave, $cmds ) );
} /**
* set a key value
*
* @param string $key
* @param mixed $value
* @param int $expire
* @return bool
*/
public function set($key, $value, $expire = 0) {
if ($this->debug) {
$this->queries [] = "custom set : $key $value";
}
$value = serialize ( $value );
$this->getRedisMaster ();
if ($expire) {
return $this->_redisMaster->setex ( $key, $expire, $value );
} else {
return $this->_redisMaster->set ( $key, $value );
}
} /**
* Get the value of a key
*
* @param string $key
* @return mixed
*/
public function get($key) {
if ($this->debug) {
$this->queries [] = "custom get : $key";
}
$this->getRedisSlave ();
return unserialize ( $this->_redisSlave->get ( $key ) );
} /**
* Call Redis method use master or slave instance.If fail,throw a ErrorException.
*
* @return
*
*/
public function __call($name, $args) {
if ($this->debug) {
$this->queries [] = "call method : $name " . implode ( ',', $args );
} if (in_array ( $name, self::$_cmdScopeMaster )) {
$this->getRedisMaster ();
return call_user_func_array ( array (
$this->_redisMaster,
$name
), $args );
} elseif (in_array ( $name, self::$_cmdScopeSlave )) {
$this->getRedisSlave ();
return call_user_func_array ( array (
$this->_redisSlave,
$name
), $args );
} else {
throw new ErrorException ( "It is an invalidate method : {$name}!" );
}
} /**
* Set redis resource to null when serializing
*/
public function __sleep() {
$this->_redisMaster = $this->_redisSlave = null;
} /**
* Set redis resource to null when destruct
*/
public function __destruct() {
$this->_redisMaster = $this->_redisSlave = null;
}
public function errorShow() {
}
}
$redis = new \Redis();
$redis->pconnect("192.168.1.19", 6379); $redis->zadd(); $time = time();
$list = $redis->zRangeByScore("powerlist",0,1441951035);
php redis 分布式类的更多相关文章
- redis分布式工具类 ----RedisShardedPoolUtil
这个是redis分布式的工具类,看非分布式的看 这里 说一下redis的分布式,分布式,无疑,肯定不是一台redis服务器.假如说,我们有两台redis服务器,一个6379端口,一个6380端口.那 ...
- c#实例化继承类,必须对被继承类的程序集做引用 .net core Redis分布式缓存客户端实现逻辑分析及示例demo 数据库笔记之索引和事务 centos 7下安装python 3.6笔记 你大波哥~ C#开源框架(转载) JSON C# Class Generator ---由json字符串生成C#实体类的工具
c#实例化继承类,必须对被继承类的程序集做引用 0x00 问题 类型“Model.NewModel”在未被引用的程序集中定义.必须添加对程序集“Model, Version=1.0.0.0, Cu ...
- Redis分布式锁的实现以及工具类
一.应用场景: 本文应用的场景为在查询数据时,发现数据不存在此时就需要去查询数据库并且更新缓存,此时可能存在高并发的请求同时打在数据库上,而针对这种情况必须要给这些请求加锁,故而采用了分布式锁的方式. ...
- 一致性Hash算法在Redis分布式中的使用
由于redis是单点,但是项目中不可避免的会使用多台Redis缓存服务器,那么怎么把缓存的Key均匀的映射到多台Redis服务器上,且随着缓存服务器的增加或减少时做到最小化的减少缓存Key的命中率呢? ...
- j2ee分布式架构 dubbo + springmvc + mybatis + ehcache + redis 分布式架构
介绍 <modules> <!-- jeesz 工具jar --> <module>jeesz-utils</module> ...
- springMVC 实现redis分布式锁
1.先配置spring-data-redis 首先是依赖 <dependency> <groupId>org.springframework.data</groupId& ...
- Lua脚本在redis分布式锁场景的运用
目录 锁和分布式锁 锁是什么? 为什么需要锁? Java中的锁 分布式锁 redis 如何实现加锁 锁超时 retry redis 如何释放锁 不该释放的锁 通过Lua脚本实现锁释放 用redis做分 ...
- Redlock:Redis分布式锁最牛逼的实现
普通实现 说道Redis分布式锁大部分人都会想到:setnx+lua,或者知道set key value px milliseconds nx.后一种方式的核心实现命令如下: - 获取锁(unique ...
- 面试官问我,Redis分布式锁如何续期?懵了。
前言 上一篇[面试官问我,使用Dubbo有没有遇到一些坑?我笑了.]之后,又有一位粉丝和我说在面试过程中被虐了.鉴于这位粉丝是之前肥朝的粉丝,而且周一又要开启新一轮的面试,为了回馈他长期以来的支持,所 ...
随机推荐
- POJ 2594 Treasure Exploration (可相交最小路径覆盖)
题意 给你张无环有向图,问至少多少条路径能够覆盖该图的所有顶点--并且,这些路径可以有交叉. 思路 不是裸的最小路径覆盖,正常的最小路径覆盖中两个人走的路径不能有重复的点,而本题可以重复. 当然我们仍 ...
- codeigniter框架扩展核心类---实现前台后台视图的分离
1. 扩展核心类,主要作用就是扩展系统现在的功能. 为前台增加独立的视图文件夹: a. 自定义路径常量 :在application ->config/ constants.php中增加 /*m ...
- vc判断文件是否存在
#include <io.h> #include <stdio.h> #include <stdlib.h> void main( void ) { /* Chec ...
- php文件读写锁
$file = fopen("test.txt", $fileOpenMode); flock($file, $lockMode) or die("Can't lock& ...
- C#操作Excel,对Sheet插入次序的控制 (有待完善)
C#对Excel文件的操作,插入工作表(Worksheet)的方法是 Workbook.Worksheets.Add().通常情况下,我们在EXCEL的工作薄中,使用菜单操作:插入一个新的工作表,那么 ...
- 平庸与卓越的差别 z
本文是清华大学陈吉宁校长于在 2015 年第一次研究生毕业典礼暨学位授予仪式上的讲话,原文标题:选择与坚持.演讲非常精彩,值得您细细阅读. 亲爱的同学们: 今天,共有 1318 名同学获得博士.硕士学 ...
- xtraTabControl 如何遍历每个选项卡 z
XtraTabHitInfo hi = tabPositionControl.CalcHitInfo(new Point(e.X, e.Y)); if (hi.HitTest == XtraTabHi ...
- Redis 对String数据类型的操作
Redis的 Strings 数据结构是简单的key-value类型,value其实不仅是String,也可以是数字.使用Strings类型,你可以完全实现目前 Memcached 的功能,并且效率更 ...
- php获取上传多个文件缺失
我们的一个页面编辑发布后台出现了图片无法上传保存的情况,经过调试对比发现,原来是file表单数量过多导致,减少file表单的数量即可上传成功.为了满足需求不减少file表单数并保证上传成功,于是更改了 ...
- dom 冒泡事件
<!doctype html> <html> <head> <meta charset="utf-8"> <style> ...