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有没有遇到一些坑?我笑了.]之后,又有一位粉丝和我说在面试过程中被虐了.鉴于这位粉丝是之前肥朝的粉丝,而且周一又要开启新一轮的面试,为了回馈他长期以来的支持,所 ...
随机推荐
- 简单使用Junit
不需要配置,导入相应jar,然后在测试的方法上面加入注解@Test 执行的时候选择junit即可.
- 15个必须知道的chrome开发者技巧(转)
15个必须知道的chrome开发者技巧 在Web开发者中,Google Chrome是使用最广泛的浏览器.六周一次的发布周期和一套强大的不断扩大开发功能,使其成为了web开发者必备的工具.你可能已经熟 ...
- Oracle 11gR2用gpnp profile存放ASM的spfile路径
从Oracle 11gR2开始,GI集成了ASM,OCR/VOTEDISK也存放在ASM磁盘组了(11gR2以前需要存放于裸设备中),同时ASM的功能较10g也有很大增强. 我们先引入一个问题:11g ...
- hadoop——配置eclipse下的map-reduce运行环境 1
1.通过修改实例模板程序来实现自己的map-reduce: 为了让示例程序run起来: 1)安装eclipse 2)安装map-reduce的eclipse插件 eclipse的map-reduce插 ...
- vim的保存误认为utf8问题
用vim改脚本改到一处写到'太原':w一下,再打开,,结果给乱码了...我默认sql是用cp936的,,,想到到和记录本的联通问题一样.... 可能会问我为什么不用utf8,,,,因为ms200 ...
- 脚本乐园 Shell中命令行选项和参数的处理
在Linux的Shell中怎样处理tail -n 10 access.log这样的命令行选项呢?这是被别人问起的一个问题,好好学习了一下,进行总结如下:在bash中,可以用以下三种方式来处理命令行参数 ...
- 分享一些Comet开发经验
前言 本comet技术主要用于数据库持久层的 穿越防火墙 远程访问.只要有一台中继网站,任意地点的数据库都能被访问. Comet概念介绍 WebIM.网页的客服.meebo等大家听说过了.最近还有个兄 ...
- C++将string转化成字符串数组
//str为需要截断的string,pattern为分隔符 std::vector<std::string> split(std::string str,std::string patte ...
- 将数字映射到字母上 .xml
映射成 A1------A20 B1------B20 ... Z1------Z20 这种形式 数字从0开始编 ...
- 《Windows程序设计第5版》学习进度备忘
书签:另外跳过的内容有待跟进 __________________学习资源: <Windows程序设计第5版珍藏版> __________________知识基础支持: _________ ...