项目框架 thinkphp,第一步创建扩展类库,ORG\Util\RdeisDb.class.php 文件,代码和测试代码如下,可直接复制使用:
测试代码:
<?php
/**
- redis 操作db 支持 Master/Slave 的负载集群
- 2016/4/27 1.0
- by woniu
- 此类库是借鉴网上修改过来,主从的没有测试
*/
class RedisDB {
//是否使用M/S的读写集群方案
private $_iscluster = false;
//Slave 服务器标记
private $_sn = 0;
/**
* 服务器连接句柄
* 只支持一台 master,可以有多台 slave
*/
private $_handle = array('master'=>'','slave'=>array());
//是否采用M/S方案
public function __construct($iscluster){
$this->_iscluster = $iscluster;
}
/**
* 服务器连接,此处是长连接(效率高,但不会关闭)
* $config 服务器配置
* $ismaster 添加的是否为主服务器
*/
public function connect($config=array('host'=>'127.0.0.1','port'=>'6379'), $ismaster=true){
//默认端口6379
if(!isset($config['port'])){
$config['port'] = '6379';
}
//设置master连接
if($ismaster){
$this->_handle['master'] = new Redis();
$db = $this->_handle['master']->pconnect($config['host'],$config['port']);
}else{
//多个slave连接
$this->_handle['slave'][$this->_sn] = new Redis();
$db = $this->_handle['slave'][$this->_sn]->pconnect($config['host'],$config['port']);
++$this->_sn;
}
return $db;
}
/**
* 关闭连接
* $flag,关闭选项,0 关闭master,1 关闭 slave,2 关闭所有
*/
public function close($flag=2){
switch ($flag) {
case 0:
$this->get_redis()->close();
break;
case 1:
for($i=0; $i<$this->_sn; ++$i){
$this->_handle['slave'][$i]->close();
}
break;
case 2:
$this->get_redis()->close();
for($i=0; $i<$this->_sn; ++$i){
$this->_handle['slave'][$i]->close();
}
break;
}
return true;
}
/**
* 得到 redis 原始对象可以有更多操作
* $ismaster=true 返回 master
* $slaveone=true,随机返回一个slave,false返回所有
*/
public function get_redis($ismaster=true,$slaveone=true){
if($ismaster){
return $this->_handle['master'];
}else{
return $slaveone ? $this->_get_slaveredis() : $this->_handle['slave'];
}
}
/**
* 条件形式设置缓存,如果key不存在就设置,存在时设置失效
* $key 缓存KEY,$value 缓存VALUE
* set if not exists
*/
public function setnx(){
return $this->get_redis()->setnx($key,$value);
}
/**
* 删除缓存
* $key 单个 key1,也可以 array(key1,key2,key3)
*/
public function remove($key){
return $this->get_redis()->remove($key);
}
/**
* 类似++$i操作,如果key不存在时自动设置为 0 后进行加加操作
* default 操作时的默认值
*/
public function incr($key,$default=1){
if($default == 1){
return $this->get_redis()->incr($key);
}else{
return $this->get_redis()->incrBy($key,$default);
}
}
/**
* 类似--$i操作,如果key不存在时自动设置为 0 后进行减减操作
* default 操作时的默认值
*/
public function decr($key,$default=1){
if($default == 1){
return $this->get_redis()->decr($key);
}else{
return $this->get_redis()->decrBy($key,$default);
}
}
/**
* 清空当前DB
*/
public function flushdb(){
return $this->get_redis()->flushDB();
}
/**
* lpush
*/
public function lpush($key,$value){
return $this->get_redis()->lpush($key,$value);
}
/**
* lpop
*/
public function lpop($key){
return $this->get_redis()->lpop($key);
}
/**
* lrange
*/
public function lrange($key,$start,$end){
return $this->get_redis()->lrange($key,$start,$end);
}
/**
* set hash opeation
*/
public function hset($name,$key,$value){
if(is_array($value)){
return $this->get_redis()->hset($name,$key,serialize($value));
}
return $this->get_redis()->hset($name,$key,$value);
}
/**
* get hash opeation
*/
public function hget($name,$key = null,$serialize=true){
if($key){
$row = $this->get_redis()->hget($name,$key);
if($row && $serialize){
unserialize($row);
}
return $row;
}
return $this->get_redis()->hgetAll($name);
}
/**
* delete hash opeation
*/
public function hdel($name,$key = null){
if($key){
return $this->get_redis()->hdel($name,$key);
}
return $this->get_redis()->hdel($name);
}
/**
* Transaction start
*/
public function multi(){
return $this->get_redis()->multi();
}
/**
* Transaction send
*/
public function exec(){
return $this->get_redis()->exec();
}
/**
* 随机hash获取 redis slave 服务器
*/
private function _get_slaveredis(){
//只有一台slave
if($this->_sn == 1){
return $this->_handle['slave'][0];
}
$hash = $this->_hashid(mt_rand(), $this->_sn);
return $this->_handle['slave'][$hash];
}
/**
* 根据ID得到 hash 后 0~m-1 之间的值
*/
private function _hashid($id,$m=10){
$k = md5($id);
$l = strlen($k);
$b = bin2hex($k);
$h = 0;
for($i=0;$i<$l;$i++){
//相加模式HASH
$h += substr($b,$i*2,2);
}
$hash = ($h*1)%$m;
return $hash;
}
public function __call($name,$arguments){
return call_user_func($name,$arguments);
}
}
网友评论