PHP实现的Redis操作通用类示例
本文实例讲述了PHP实现的Redis操作通用类。分享给大家供大家参考,具体如下:
找到一个比较全的RedisPHP操作类库,分享给大家
30, //选择的数据库。 'db_id'=>0, ); //什么时候重新建立连接 protected$expireTime; protected$host; protected$port; privatefunction__construct($config,$attr=array()) { $this->attr=array_merge($this->attr,$attr); $this->redis=newRedis(); $this->port=$config['port']?$config['port']:6379; $this->host=$config['host']; $this->redis->connect($this->host,$this->port,$this->attr['timeout']); if($config['auth']) { $this->auth($config['auth']); $this->auth=$config['auth']; } $this->expireTime=time()+$this->attr['timeout']; } /** *得到实例化的对象. *为每个数据库建立一个连接 *如果连接超时,将会重新建立一个连接 *@paramarray$config *@paramint$dbId *@return\iphp\db\Redis */ publicstaticfunctiongetInstance($config,$attr=array()) { //如果是一个字符串,将其认为是数据库的ID号。以简化写法。 if(!is_array($attr)) { $dbId=$attr; $attr=array(); $attr['db_id']=$dbId; } $attr['db_id']=$attr['db_id']?$attr['db_id']:0; $k=md5(implode('',$config).$attr['db_id']); if(!(static::$_instance[$k]instanceofself)) { static::$_instance[$k]=newself($config,$attr); static::$_instance[$k]->k=$k; static::$_instance[$k]->dbId=$attr['db_id']; //如果不是0号库,选择一下数据库。 if($attr['db_id']!=0){ static::$_instance[$k]->select($attr['db_id']); } } elseif(time()>static::$_instance[$k]->expireTime) { static::$_instance[$k]->close(); static::$_instance[$k]=newself($config,$attr); static::$_instance[$k]->k=$k; static::$_instance[$k]->dbId=$attr['db_id']; //如果不是0号库,选择一下数据库。 if($attr['db_id']!=0){ static::$_instance[$k]->select($attr['db_id']); } } returnstatic::$_instance[$k]; } privatefunction__clone(){} /** *执行原生的redis操作 *@return\Redis */ publicfunctiongetRedis() { return$this->redis; } /*****************hash表操作函数*******************/ /** *得到hash表中一个字段的值 *@paramstring$key缓存key *@paramstring$field字段 *@returnstring|false */ publicfunctionhGet($key,$field) { return$this->redis->hGet($key,$field); } /** *为hash表设定一个字段的值 *@paramstring$key缓存key *@paramstring$field字段 *@paramstring$value值。 *@returnbool */ publicfunctionhSet($key,$field,$value) { return$this->redis->hSet($key,$field,$value); } /** *判断hash表中,指定field是不是存在 *@paramstring$key缓存key *@paramstring$field字段 *@returnbool */ publicfunctionhExists($key,$field) { return$this->redis->hExists($key,$field); } /** *删除hash表中指定字段,支持批量删除 *@paramstring$key缓存key *@paramstring$field字段 *@returnint */ publicfunctionhdel($key,$field) { $fieldArr=explode(',',$field); $delNum=0; foreach($fieldArras$row) { $row=trim($row); $delNum+=$this->redis->hDel($key,$row); } return$delNum; } /** *返回hash表元素个数 *@paramstring$key缓存key *@returnint|bool */ publicfunctionhLen($key) { return$this->redis->hLen($key); } /** *为hash表设定一个字段的值,如果字段存在,返回false *@paramstring$key缓存key *@paramstring$field字段 *@paramstring$value值。 *@returnbool */ publicfunctionhSetNx($key,$field,$value) { return$this->redis->hSetNx($key,$field,$value); } /** *为hash表多个字段设定值。 *@paramstring$key *@paramarray$value *@returnarray|bool */ publicfunctionhMset($key,$value) { if(!is_array($value)) returnfalse; return$this->redis->hMset($key,$value); } /** *为hash表多个字段设定值。 *@paramstring$key *@paramarray|string$valuestring以','号分隔字段 *@returnarray|bool */ publicfunctionhMget($key,$field) { if(!is_array($field)) $field=explode(',',$field); return$this->redis->hMget($key,$field); } /** *为hash表设这累加,可以负数 *@paramstring$key *@paramint$field *@paramstring$value *@returnbool */ publicfunctionhIncrBy($key,$field,$value) { $value=intval($value); return$this->redis->hIncrBy($key,$field,$value); } /** *返回所有hash表的所有字段 *@paramstring$key *@returnarray|bool */ publicfunctionhKeys($key) { return$this->redis->hKeys($key); } /** *返回所有hash表的字段值,为一个索引数组 *@paramstring$key *@returnarray|bool */ publicfunctionhVals($key) { return$this->redis->hVals($key); } /** *返回所有hash表的字段值,为一个关联数组 *@paramstring$key *@returnarray|bool */ publicfunctionhGetAll($key) { return$this->redis->hGetAll($key); } /*********************有序集合操作*********************/ /** *给当前集合添加一个元素 *如果value已经存在,会更新order的值。 *@paramstring$key *@paramstring$order序号 *@paramstring$value值 *@returnbool */ publicfunctionzAdd($key,$order,$value) { return$this->redis->zAdd($key,$order,$value); } /** *给$value成员的order值,增加$num,可以为负数 *@paramstring$key *@paramstring$num序号 *@paramstring$value值 *@return返回新的order */ publicfunctionzinCry($key,$num,$value) { return$this->redis->zinCry($key,$num,$value); } /** *删除值为value的元素 *@paramstring$key *@paramstirng$value *@returnbool */ publicfunctionzRem($key,$value) { return$this->redis->zRem($key,$value); } /** *集合以order递增排列后,0表示第一个元素,-1表示最后一个元素 *@paramstring$key *@paramint$start *@paramint$end *@returnarray|bool */ publicfunctionzRange($key,$start,$end) { return$this->redis->zRange($key,$start,$end); } /** *集合以order递减排列后,0表示第一个元素,-1表示最后一个元素 *@paramstring$key *@paramint$start *@paramint$end *@returnarray|bool */ publicfunctionzRevRange($key,$start,$end) { return$this->redis->zRevRange($key,$start,$end); } /** *集合以order递增排列后,返回指定order之间的元素。 *min和max可以是-inf和+inf表示最大值,最小值 *@paramstring$key *@paramint$start *@paramint$end *@packagearray$option参数 *withscores=>true,表示数组下标为Order值,默认返回索引数组 *limit=>array(0,1)表示从0开始,取一条记录。 *@returnarray|bool */ publicfunctionzRangeByScore($key,$start='-inf',$end="+inf",$option=array()) { return$this->redis->zRangeByScore($key,$start,$end,$option); } /** *集合以order递减排列后,返回指定order之间的元素。 *min和max可以是-inf和+inf表示最大值,最小值 *@paramstring$key *@paramint$start *@paramint$end *@packagearray$option参数 *withscores=>true,表示数组下标为Order值,默认返回索引数组 *limit=>array(0,1)表示从0开始,取一条记录。 *@returnarray|bool */ publicfunctionzRevRangeByScore($key,$start='-inf',$end="+inf",$option=array()) { return$this->redis->zRevRangeByScore($key,$start,$end,$option); } /** *返回order值在startend之间的数量 *@paramunknown$key *@paramunknown$start *@paramunknown$end */ publicfunctionzCount($key,$start,$end) { return$this->redis->zCount($key,$start,$end); } /** *返回值为value的order值 *@paramunknown$key *@paramunknown$value */ publicfunctionzScore($key,$value) { return$this->redis->zScore($key,$value); } /** *返回集合以score递增加排序后,指定成员的排序号,从0开始。 *@paramunknown$key *@paramunknown$value */ publicfunctionzRank($key,$value) { return$this->redis->zRank($key,$value); } /** *返回集合以score递增加排序后,指定成员的排序号,从0开始。 *@paramunknown$key *@paramunknown$value */ publicfunctionzRevRank($key,$value) { return$this->redis->zRevRank($key,$value); } /** *删除集合中,score值在startend之间的元素包括startend *min和max可以是-inf和+inf表示最大值,最小值 *@paramunknown$key *@paramunknown$start *@paramunknown$end *@return删除成员的数量。 */ publicfunctionzRemRangeByScore($key,$start,$end) { return$this->redis->zRemRangeByScore($key,$start,$end); } /** *返回集合元素个数。 *@paramunknown$key */ publicfunctionzCard($key) { return$this->redis->zCard($key); } /*********************队列操作命令************************/ /** *在队列尾部插入一个元素 *@paramunknown$key *@paramunknown$value *返回队列长度 */ publicfunctionrPush($key,$value) { return$this->redis->rPush($key,$value); } /** *在队列尾部插入一个元素如果key不存在,什么也不做 *@paramunknown$key *@paramunknown$value *返回队列长度 */ publicfunctionrPushx($key,$value) { return$this->redis->rPushx($key,$value); } /** *在队列头部插入一个元素 *@paramunknown$key *@paramunknown$value *返回队列长度 */ publicfunctionlPush($key,$value) { return$this->redis->lPush($key,$value); } /** *在队列头插入一个元素如果key不存在,什么也不做 *@paramunknown$key *@paramunknown$value *返回队列长度 */ publicfunctionlPushx($key,$value) { return$this->redis->lPushx($key,$value); } /** *返回队列长度 *@paramunknown$key */ publicfunctionlLen($key) { return$this->redis->lLen($key); } /** *返回队列指定区间的元素 *@paramunknown$key *@paramunknown$start *@paramunknown$end */ publicfunctionlRange($key,$start,$end) { return$this->redis->lrange($key,$start,$end); } /** *返回队列中指定索引的元素 *@paramunknown$key *@paramunknown$index */ publicfunctionlIndex($key,$index) { return$this->redis->lIndex($key,$index); } /** *设定队列中指定index的值。 *@paramunknown$key *@paramunknown$index *@paramunknown$value */ publicfunctionlSet($key,$index,$value) { return$this->redis->lSet($key,$index,$value); } /** *删除值为vaule的count个元素 *PHP-REDIS扩展的数据顺序与命令的顺序不太一样,不知道是不是bug *count>0从尾部开始 *>0从头部开始 *=0删除全部 *@paramunknown$key *@paramunknown$count *@paramunknown$value */ publicfunctionlRem($key,$count,$value) { return$this->redis->lRem($key,$value,$count); } /** *删除并返回队列中的头元素。 *@paramunknown$key */ publicfunctionlPop($key) { return$this->redis->lPop($key); } /** *删除并返回队列中的尾元素 *@paramunknown$key */ publicfunctionrPop($key) { return$this->redis->rPop($key); } /*************redis字符串操作命令*****************/ /** *设置一个key *@paramunknown$key *@paramunknown$value */ publicfunctionset($key,$value) { return$this->redis->set($key,$value); } /** *得到一个key *@paramunknown$key */ publicfunctionget($key) { return$this->redis->get($key); } /** *设置一个有过期时间的key *@paramunknown$key *@paramunknown$expire *@paramunknown$value */ publicfunctionsetex($key,$expire,$value) { return$this->redis->setex($key,$expire,$value); } /** *设置一个key,如果key存在,不做任何操作. *@paramunknown$key *@paramunknown$value */ publicfunctionsetnx($key,$value) { return$this->redis->setnx($key,$value); } /** *批量设置key *@paramunknown$arr */ publicfunctionmset($arr) { return$this->redis->mset($arr); } /*************redis无序集合操作命令*****************/ /** *返回集合中所有元素 *@paramunknown$key */ publicfunctionsMembers($key) { return$this->redis->sMembers($key); } /** *求2个集合的差集 *@paramunknown$key1 *@paramunknown$key2 */ publicfunctionsDiff($key1,$key2) { return$this->redis->sDiff($key1,$key2); } /** *添加集合。由于版本问题,扩展不支持批量添加。这里做了封装 *@paramunknown$key *@paramstring|array$value */ publicfunctionsAdd($key,$value) { if(!is_array($value)) $arr=array($value); else $arr=$value; foreach($arras$row) $this->redis->sAdd($key,$row); } /** *返回无序集合的元素个数 *@paramunknown$key */ publicfunctionscard($key) { return$this->redis->scard($key); } /** *从集合中删除一个元素 *@paramunknown$key *@paramunknown$value */ publicfunctionsrem($key,$value) { return$this->redis->srem($key,$value); } /*************redis管理操作命令*****************/ /** *选择数据库 *@paramint$dbId数据库ID号 *@returnbool */ publicfunctionselect($dbId) { $this->dbId=$dbId; return$this->redis->select($dbId); } /** *清空当前数据库 *@returnbool */ publicfunctionflushDB() { return$this->redis->flushDB(); } /** *返回当前库状态 *@returnarray */ publicfunctioninfo() { return$this->redis->info(); } /** *同步保存数据到磁盘 */ publicfunctionsave() { return$this->redis->save(); } /** *异步保存数据到磁盘 */ publicfunctionbgSave() { return$this->redis->bgSave(); } /** *返回最后保存到磁盘的时间 */ publicfunctionlastSave() { return$this->redis->lastSave(); } /** *返回key,支持*多个字符,?一个字符 *只有*表示全部 *@paramstring$key *@returnarray */ publicfunctionkeys($key) { return$this->redis->keys($key); } /** *删除指定key *@paramunknown$key */ publicfunctiondel($key) { return$this->redis->del($key); } /** *判断一个key值是不是存在 *@paramunknown$key */ publicfunctionexists($key) { return$this->redis->exists($key); } /** *为一个key设定过期时间单位为秒 *@paramunknown$key *@paramunknown$expire */ publicfunctionexpire($key,$expire) { return$this->redis->expire($key,$expire); } /** *返回一个key还有多久过期,单位秒 *@paramunknown$key */ publicfunctionttl($key) { return$this->redis->ttl($key); } /** *设定一个key什么时候过期,time为一个时间戳 *@paramunknown$key *@paramunknown$time */ publicfunctionexprieAt($key,$time) { return$this->redis->expireAt($key,$time); } /** *关闭服务器链接 */ publicfunctionclose() { return$this->redis->close(); } /** *关闭所有连接 */ publicstaticfunctioncloseAll() { foreach(static::$_instanceas$o) { if($oinstanceofself) $o->close(); } } /**这里不关闭连接,因为session写入会在所有对象销毁之后。 publicfunction__destruct() { return$this->redis->close(); } **/ /** *返回当前数据库key数量 */ publicfunctiondbSize() { return$this->redis->dbSize(); } /** *返回一个随机key */ publicfunctionrandomKey() { return$this->redis->randomKey(); } /** *得到当前数据库ID *@returnint */ publicfunctiongetDbId() { return$this->dbId; } /** *返回当前密码 */ publicfunctiongetAuth() { return$this->auth; } publicfunctiongetHost() { return$this->host; } publicfunctiongetPort() { return$this->port; } publicfunctiongetConnInfo() { returnarray( 'host'=>$this->host, 'port'=>$this->port, 'auth'=>$this->auth ); } /*********************事务的相关方法************************/ /** *监控key,就是一个或多个key添加一个乐观锁 *在此期间如果key的值如果发生的改变,刚不能为key设定值 *可以重新取得Key的值。 *@paramunknown$key */ publicfunctionwatch($key) { return$this->redis->watch($key); } /** *取消当前链接对所有key的watch *EXEC命令或DISCARD命令先被执行了的话,那么就不需要再执行UNWATCH了 */ publicfunctionunwatch() { return$this->redis->unwatch(); } /** *开启一个事务 *事务的调用有两种模式Redis::MULTI和Redis::PIPELINE, *默认是Redis::MULTI模式, *Redis::PIPELINE管道模式速度更快,但没有任何保证原子性有可能造成数据的丢失 */ publicfunctionmulti($type=\Redis::MULTI) { return$this->redis->multi($type); } /** *执行一个事务 *收到EXEC命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行 */ publicfunctionexec() { return$this->redis->exec(); } /** *回滚一个事务 */ publicfunctiondiscard() { return$this->redis->discard(); } /** *测试当前链接是不是已经失效 *没有失效返回+PONG *失效返回false */ publicfunctionping() { return$this->redis->ping(); } publicfunctionauth($auth) { return$this->redis->auth($auth); } /*********************自定义的方法,用于简化操作************************/ /** *得到一组的ID号 *@paramunknown$prefix *@paramunknown$ids */ publicfunctionhashAll($prefix,$ids) { if($ids==false) returnfalse; if(is_string($ids)) $ids=explode(',',$ids); $arr=array(); foreach($idsas$id) { $key=$prefix.'.'.$id; $res=$this->hGetAll($key); if($res!=false) $arr[]=$res; } return$arr; } /** *生成一条消息,放在redis数据库中。使用0号库。 *@paramstring|array$msg */ publicfunctionpushMessage($lkey,$msg) { if(is_array($msg)){ $msg=json_encode($msg); } $key=md5($msg); //如果消息已经存在,删除旧消息,已当前消息为准 //echo$n=$this->lRem($lkey,0,$key)."\n"; //重新设置新消息 $this->lPush($lkey,$key); $this->setex($key,3600,$msg); return$key; } /** *得到条批量删除key的命令 *@paramunknown$keys *@paramunknown$dbId */ publicfunctiondelKeys($keys,$dbId) { $redisInfo=$this->getConnInfo(); $cmdArr=array( 'redis-cli', '-a', $redisInfo['auth'], '-h', $redisInfo['host'], '-p', $redisInfo['port'], '-n', $dbId, ); $redisStr=implode('',$cmdArr); $cmd="{$redisStr}KEYS\"{$keys}\"|xargs{$redisStr}del"; return$cmd; } }
更多关于PHP相关内容感兴趣的读者可查看本站专题:《php+redis数据库程序设计技巧总结》、《php面向对象程序设计入门教程》、《PHP基本语法入门教程》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。