Redis常用操作类


这是一个封装好的redis常用类,function里面并没有把所有的都封装,只是把最近项目用到的都封装了而已,这里有个比较完整的,需要可以查看。

因为最近做的项目是基于ThinkPHP框架,所以有少量方法是用的TP的内置方法,当然这一部分很少而且应该有基础的PHPer都能看懂。当然,正是因为是基于TP写的类,所以这个类也可以直接替代官方的redis类使用(官方的方法很少而且不好使)。

另外如果在使用过程中出现redis连接超时的情况各位可以尝试修改PHP的socket超时时间来解决:

ini_set(‘default_socket_timeout’, -1);//避免redis超时无法连接

 

差不多就这些,最后,奉上redis常用操作类:

<?php
/**
 * User: 佐柱
 * Date: 14-4-17
 */
namespace Admin\Model;
use Think\Model;
class RedisModel extends Model{
    protected $redis = null;
    protected $redisList = 'searchList';
    /*
     * 单例模式初始化Redis
     */
    public function _initialize(){
        //单例模式
        if($this->redis === null){
            $this->redis =  new \Redis();
            if(C('REDIS_CTYPE') == 1){
                $this->redis->connect(C('REDIS_HOST'), C('REDIS_PORT'), C('REDIS_CACHE_TIMEOUT'));
            }else{
                $this->redis->pconnect(C('REDIS_HOST'), C('REDIS_PORT'), C('REDIS_CACHE_TIMEOUT'));
            }
            $this->redis->setOption('Redis::OPT_PREFIX', C('REDIS_PREFIX'));//设置每一个key的前缀,区别其他APP
        }
    }
    /*
     * 覆盖存入key-value
     * param string $key 键
     * param string/array $value 值
     * param int    $liveTime 有效时间
     * return true成功,false失败
     */
    public function set($key,$value,$liveTime = 0){
        if(empty($key) || empty($value)){
            $this->error = 'key或value不能为空';
            return false;
        }
        $key = $this->securityFilters($key);
        $value = $this->securityFilters($value);
        //redis的value只能是非数组,数组数据转化成json格式存入
        $value = is_array($value) ? json_encode($value) : $value;
        if($liveTime == 0){
            $this->redis->set($key,$value);
        }else{
            $liveTime = $this->securityFilters($liveTime,true);
            $this->redis->setex($key,$liveTime,$value);
        }
        return true;
    }
    /*
     * 批量覆盖存入key-value
     * param array $array_set 需要存入的数据,格式如下
     * array('key'=>'value')
     * array(0=>array(key => 'key',value => 'value',liveTime => 'liveTime'),1=>array('key','value','liveTime'))
     * param boolean $isLiveTime 是否存在过期时间
     * return array('success' => 0,'failure' => 0)成功,false失败
     */
    public function sets($array_set,$isLiveTime = false){
        $success = 0;//成功条数
        $failure = 0;//失败条数
        if(is_array($array_set)){
            if(!$isLiveTime){//不需要存入过期时间的操作
                //原子性操作
                if($this->redis->mset($array_set)){
                    $success = count($array_set);
                }else{
                    $failure = count($array_set);
                }
            }else{//需要存入过期时间的操作
                unset($value);
                foreach($array_set as $value){
                    if($this->set($value['key'],$value['value'],$value['liveTime'])){
                        $success++;
                    }else{
                        $this->error .= '失败key:'.$value['key'].';';
                        $failure++;
                    }
                }
            }
            return array('success' => $success,'failure' => $failure);
        }else{
            $this->error = '数据格式错误';
            return false;
        }
    }
    /*
     * 返回剩余key生存时间
     * param string $key key
     * return int 剩余生存时间
     */
    public function tll($key){
        $liveTime = $this->redis->tll($key);
        return $liveTime;
    }
    /*
     * 不覆盖存入key-value
     * param array $array_set 需要存入的数据,格式如下
     * array('key'=>'value')
     * array(0=>array(key => 'key',value => 'value',liveTime => 'liveTime'),1=>array('key','value','liveTime'))
     * param boolean $isLiveTime 是否存在过期时间
     * return array('success' => 0,'failure' => 0)成功,false失败
     */
    public function setnx($key,$value,$liveTime = 0){
        if(empty($key) || empty($value)){
            return false;
        }
        $key = $this->securityFilters($key);
        $value = $this->securityFilters($value);
        $value = is_array($value) ? json_encode($value) : $value;
        $this->redis->setnx($key,$value);
        if($liveTime != 0){
            $liveTime = $this->securityFilters($liveTime,true);
            $this->redis->expire($key,$liveTime);
        }
        return true;
    }
    /*
     * 将给定key的值设为value,并返回key的旧值
     * param string $key key
     * param string $newValue 新value
     * return string成功,false失败
     */
    public function getset($key,$newValue){
        $oldValue = '';
        if(!empty($key) && !empty($newValue)){
            $newValue = $this->securityFilters($newValue);
            $newValue = is_array($newValue) ? json_encode($newValue) : $newValue;
            $oldValue = $this->redis->getset($key,$newValue);
            return $oldValue;
        }else{
            $this->error = 'key和value不能为空';
            return false;
        }
    }
    /*
     * 取出value
     * param string $key 键
     * return string成功,false失败
     */
    public function get($key){
        $value = $this->redis->get($key);
        //判断是否为json格式的数据,是则转化回数组
        $value = is_null(json_decode($value)) ? $value :json_decode($value,true);
        return $value;
    }
    /*
     * 批量取出value
     * param array $keys 键
     * return array成功,false失败
     */
    public function gets($keys){
        if(is_array($keys)){
            $tmpValues = $this->redis->mget($keys);
            foreach($tmpValues as $param){
                $values[] = is_null(json_decode($param)) ? $param :json_decode($param,true);
            }
            return $values;
        }else{
            $this->error = '数据格式错误';
            return false;
        }
    }
    /*
     * 是否存在指定key的value
     * param string $key key
     * return true存在,false不存在
     */
    public function exists($key){
        if(!empty($key)){
            $res = $this->redis->exists($key);
            return $res ;
        }else{
            $this->error = '查询key不能为空';
            return false;
        }
    }
    /*
     * 查看所有key-value
     * return array
     */
    public function showKey(){
        $this->redis->keys(C('REDIS_PREFIX').'*');
    }
    /*
     * 删除key
     * param string/array $key key
     * return true成功,false失败
     */
    public function rm($key){
        return $this->redis->del($key);
    }
    /**
     * 数据进栈尾
     * @param array list 进栈数据
     * @param bool isLoop 是否开启循环进栈,true为开启,false为关闭,默认关闭
     * @return string,flase 插入的数据ID,操作出错时返回false
     */
    public function push($list,$isLoop = false){
        if(!$isLoop){
            if (!empty($list)){
                if($list){
                    $this->redis->rPush($this->redisList,$list);
                    return true;
                } else {
                    return false;
                }
            } else {
                return false;
            }
        } else {
            if (!empty($list)) {
                $ids = array();
                if(isset($value))    unset($value);
                foreach ($list as $key=>$value){
                    $res = $this->push($value,false);
                    if ($res) {
                        $ids[$key] = $res;
                    } else {
                        $ids[$key] = false;
                    }
                }
            }else {
                return false;
            }
        }
    }
    /**
     * 数据出栈
     * @return array,false 栈内数据,栈为空时返回false
     */
    public function pop(){
        $list = $this->redis->lPop($this->redisList);
        if($list){
            return $list;
        } else {
            return false;
        }
    }
    /**
     * 获取栈中还有数据数目
     * @return int,false 返回栈内数据数,栈为空时返回false
     */
    public function listNum(){
        $len = 0;
        $len = $this->redis->lSize($this->redisList);
        if($len){
            return $len;
        } else {
            return false;
        }
    }
    /**
     * 循环取出栈中的所有数据
     * @return array,flase 邮件信息,取完则返回false
     */
    public function fetch_row(){
        $list = array();
        $i = 0;
        while ($this->redis->lGet($this->redisList,$i)){
            $list[] = $this->redis->lGet($this->redisList,$i);
            $i++;
        }
        if (!empty($list)) {
            return $list;
        } else {
            return false;
        }
    }
    /*
     * 清空所有key-value
     */
    public function clear(){
        $this->redis->flushAll();
    }
    /*
     * 字符串、数字安全过滤
     * param string $unsafe 需要过滤的字符串或数字
     * return string\int 过滤后的字符或字符串
     */
    protected function securityFilters($unsafe,$toInt = false){
        if(!$toInt && !is_int($unsafe)){
            if(is_string($unsafe)){
                $safe = addslashes(trim($unsafe));
            }elseif(is_array($unsafe)){
                unset($key);
                unset($value);
                foreach($unsafe as $key => $value){
                    $safe[$this->securityFilters($key)] = $this->securityFilters($value);
                }
            }else{
                    $this->error = '非法数据类型!';
                    return null;
            }
        }else{
            $safe = intval($unsafe);
        }
        return $safe;
    }
}

转载请注明文章出处:http://www.mudoom.com 谢谢:)


发表评论