windows下php redis扩展封装类库的使用

2016-05-27  本文已影响401人  蜗牛MVP

项目框架 thinkphp,第一步创建扩展类库,ORG\Util\RdeisDb.class.php 文件,代码和测试代码如下,可直接复制使用:
测试代码:

测试代码

<?php

/**

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);
}

}

上一篇下一篇

猜你喜欢

热点阅读