这是一个封装好的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 谢谢:)