美文网首页
windows下php redis扩展封装类库的使用

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

作者: 蜗牛MVP | 来源:发表于2016-05-27 15:48 被阅读401次

    项目框架 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);
    }
    

    }

    相关文章

      网友评论

          本文标题:windows下php redis扩展封装类库的使用

          本文链接:https://www.haomeiwen.com/subject/vpucrttx.html