2018-06-29 09:35:06 1563瀏覽
本文實例講述了PHP實現(xiàn)的Redis操作通用類。分享給大家供大家參考,可以更多的去了解Redis通用類的大概類型,方便之后去接觸和深入的了解,更方便以后的去了解PHP的一些其他的東西,好讓自己以后學(xué)習(xí)PHP更加迅速。望大家有好的建議。
找到一個比較全的RedisPHP操作類庫,分享給大家
<?php /** *redis操作類 *說明,任何為false的串,存在redis中都是空串。 *只有在key不存在時,才會返回false。 *這點可用于防止緩存穿透 * */ classRedis { private$redis; //當(dāng)前數(shù)據(jù)庫ID號 protected$dbId=0; //當(dāng)前權(quán)限認(rèn)證碼 protected$auth; /** *實例化的對象,單例模式. *@var\iphp\db\Redis */ staticprivate$_instance=array(); private$k; //連接屬性數(shù)組 protected$attr=array( //連接超時時間,redis配置文件中默認(rèn)為300秒 'timeout'=>30, //選擇的數(shù)據(jù)庫。 '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']; } /** *得到實例化的對象. *為每個數(shù)據(jù)庫建立一個連接 *如果連接超時,將會重新建立一個連接 *@paramarray$config *@paramint$dbId *@return\iphp\db\Redis */ publicstaticfunctiongetInstance($config,$attr=array()) { //如果是一個字符串,將其認(rèn)為是數(shù)據(jù)庫的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號庫,選擇一下數(shù)據(jù)庫。 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號庫,選擇一下數(shù)據(jù)庫。 if($attr['db_id']!=0){ static::$_instance[$k]->select($attr['db_id']); } } returnstatic::$_instance[$k]; } privatefunction__clone(){} /** *執(zhí)行原生的redis操作 *@return\Redis */ publicfunctiongetRedis() { return$this->redis; } /*****************hash表操作函數(shù)*******************/ /** *得到hash表中一個字段的值 *@paramstring$key緩存key *@paramstring$field字段 *@returnstring|false */ publicfunctionhGet($key,$field) { return$this->redis->hGet($key,$field); } /** *為hash表設(shè)定一個字段的值 *@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表元素個數(shù) *@paramstring$key緩存key *@returnint|bool */ publicfunctionhLen($key) { return$this->redis->hLen($key); } /** *為hash表設(shè)定一個字段的值,如果字段存在,返回false *@paramstring$key緩存key *@paramstring$field字段 *@paramstring$value值。 *@returnbool */ publicfunctionhSetNx($key,$field,$value) { return$this->redis->hSetNx($key,$field,$value); } /** *為hash表多個字段設(shè)定值。 *@paramstring$key *@paramarray$value *@returnarray|bool */ publicfunctionhMset($key,$value) { if(!is_array($value)) returnfalse; return$this->redis->hMset($key,$value); } /** *為hash表多個字段設(shè)定值。 *@paramstring$key *@paramarray|string$valuestring以','號分隔字段 *@returnarray|bool */ publicfunctionhMget($key,$field) { if(!is_array($field)) $field=explode(',',$field); return$this->redis->hMget($key,$field); } /** *為hash表設(shè)這累加,可以負(fù)數(shù) *@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表的字段值,為一個索引數(shù)組 *@paramstring$key *@returnarray|bool */ publicfunctionhVals($key) { return$this->redis->hVals($key); } /** *返回所有hash表的字段值,為一個關(guān)聯(lián)數(shù)組 *@paramstring$key *@returnarray|bool */ publicfunctionhGetAll($key) { return$this->redis->hGetAll($key); } /*********************有序集合操作*********************/ /** *給當(dāng)前集合添加一個元素 *如果value已經(jīng)存在,會更新order的值。 *@paramstring$key *@paramstring$order序號 *@paramstring$value值 *@returnbool */ publicfunctionzAdd($key,$order,$value) { return$this->redis->zAdd($key,$order,$value); } /** *給$value成員的order值,增加$num,可以為負(fù)數(shù) *@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參數(shù) *withscores=>true,表示數(shù)組下標(biāo)為Order值,默認(rèn)返回索引數(shù)組 *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參數(shù) *withscores=>true,表示數(shù)組下標(biāo)為Order值,默認(rèn)返回索引數(shù)組 *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之間的數(shù)量 *@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刪除成員的數(shù)量。 */ publicfunctionzRemRangeByScore($key,$start,$end) { return$this->redis->zRemRangeByScore($key,$start,$end); } /** *返回集合元素個數(shù)。 *@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); } /** *返回隊列指定區(qū)間的元素 *@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); } /** *設(shè)定隊列中指定index的值。 *@paramunknown$key *@paramunknown$index *@paramunknown$value */ publicfunctionlSet($key,$index,$value) { return$this->redis->lSet($key,$index,$value); } /** *刪除值為vaule的count個元素 *PHP-REDIS擴(kuò)展的數(shù)據(jù)順序與命令的順序不太一樣,不知道是不是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字符串操作命令*****************/ /** *設(shè)置一個key *@paramunknown$key *@paramunknown$value */ publicfunctionset($key,$value) { return$this->redis->set($key,$value); } /** *得到一個key *@paramunknown$key */ publicfunctionget($key) { return$this->redis->get($key); } /** *設(shè)置一個有過期時間的key *@paramunknown$key *@paramunknown$expire *@paramunknown$value */ publicfunctionsetex($key,$expire,$value) { return$this->redis->setex($key,$expire,$value); } /** *設(shè)置一個key,如果key存在,不做任何操作. *@paramunknown$key *@paramunknown$value */ publicfunctionsetnx($key,$value) { return$this->redis->setnx($key,$value); } /** *批量設(shè)置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); } /** *添加集合。由于版本問題,擴(kuò)展不支持批量添加。這里做了封裝 *@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); } /** *返回?zé)o序集合的元素個數(shù) *@paramunknown$key */ publicfunctionscard($key) { return$this->redis->scard($key); } /** *從集合中刪除一個元素 *@paramunknown$key *@paramunknown$value */ publicfunctionsrem($key,$value) { return$this->redis->srem($key,$value); } /*************redis管理操作命令*****************/ /** *選擇數(shù)據(jù)庫 *@paramint$dbId數(shù)據(jù)庫ID號 *@returnbool */ publicfunctionselect($dbId) { $this->dbId=$dbId; return$this->redis->select($dbId); } /** *清空當(dāng)前數(shù)據(jù)庫 *@returnbool */ publicfunctionflushDB() { return$this->redis->flushDB(); } /** *返回當(dāng)前庫狀態(tài) *@returnarray */ publicfunctioninfo() { return$this->redis->info(); } /** *同步保存數(shù)據(jù)到磁盤 */ publicfunctionsave() { return$this->redis->save(); } /** *異步保存數(shù)據(jù)到磁盤 */ 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設(shè)定過期時間單位為秒 *@paramunknown$key *@paramunknown$expire */ publicfunctionexpire($key,$expire) { return$this->redis->expire($key,$expire); } /** *返回一個key還有多久過期,單位秒 *@paramunknown$key */ publicfunctionttl($key) { return$this->redis->ttl($key); } /** *設(shè)定一個key什么時候過期,time為一個時間戳 *@paramunknown$key *@paramunknown$time */ publicfunctionexprieAt($key,$time) { return$this->redis->expireAt($key,$time); } /** *關(guān)閉服務(wù)器鏈接 */ publicfunctionclose() { return$this->redis->close(); } /** *關(guān)閉所有連接 */ publicstaticfunctioncloseAll() { foreach(static::$_instanceas$o) { if($oinstanceofself) $o->close(); } } /**這里不關(guān)閉連接,因為session寫入會在所有對象銷毀之后。 publicfunction__destruct() { return$this->redis->close(); } **/ /** *返回當(dāng)前數(shù)據(jù)庫key數(shù)量 */ publicfunctiondbSize() { return$this->redis->dbSize(); } /** *返回一個隨機(jī)key */ publicfunctionrandomKey() { return$this->redis->randomKey(); } /** *得到當(dāng)前數(shù)據(jù)庫ID *@returnint */ publicfunctiongetDbId() { return$this->dbId; } /** *返回當(dāng)前密碼 */ publicfunctiongetAuth() { return$this->auth; } publicfunctiongetHost() { return$this->host; } publicfunctiongetPort() { return$this->port; } publicfunctiongetConnInfo() { returnarray( 'host'=>$this->host, 'port'=>$this->port, 'auth'=>$this->auth ); } /*********************事務(wù)的相關(guān)方法************************/ /** *監(jiān)控key,就是一個或多個key添加一個樂觀鎖 *在此期間如果key的值如果發(fā)生的改變,剛不能為key設(shè)定值 *可以重新取得Key的值。 *@paramunknown$key */ publicfunctionwatch($key) { return$this->redis->watch($key); } /** *取消當(dāng)前鏈接對所有key的watch *EXEC命令或DISCARD命令先被執(zhí)行了的話,那么就不需要再執(zhí)行UNWATCH了 */ publicfunctionunwatch() { return$this->redis->unwatch(); } /** *開啟一個事務(wù) *事務(wù)的調(diào)用有兩種模式Redis::MULTI和Redis::PIPELINE, *默認(rèn)是Redis::MULTI模式, *Redis::PIPELINE管道模式速度更快,但沒有任何保證原子性有可能造成數(shù)據(jù)的丟失 */ publicfunctionmulti($type=\Redis::MULTI) { return$this->redis->multi($type); } /** *執(zhí)行一個事務(wù) *收到EXEC命令后進(jìn)入事務(wù)執(zhí)行,事務(wù)中任意命令執(zhí)行失敗,其余的命令依然被執(zhí)行 */ publicfunctionexec() { return$this->redis->exec(); } /** *回滾一個事務(wù) */ publicfunctiondiscard() { return$this->redis->discard(); } /** *測試當(dāng)前鏈接是不是已經(jīng)失效 *沒有失效返回+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數(shù)據(jù)庫中。使用0號庫。 *@paramstring|array$msg */ publicfunctionpushMessage($lkey,$msg) { if(is_array($msg)){ $msg=json_encode($msg); } $key=md5($msg); //如果消息已經(jīng)存在,刪除舊消息,已當(dāng)前消息為準(zhǔn) //echo$n=$this->lRem($lkey,0,$key)."\n"; //重新設(shè)置新消息 $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; } }
以上就時扣丁學(xué)堂對PHP實現(xiàn)的Redis操作通用類示例的簡述,希望大家多加瀏覽,方便大家查閱,更多的讓大家去了解PHP,如果有對PHP感興趣的朋友,想要了解更多,請登錄扣丁學(xué)堂官網(wǎng),或關(guān)注微信公眾號,了解更多知識,更有大量PHP在線視頻教程等你來學(xué)習(xí)觀看?。?
【關(guān)注微信公眾號獲取更多學(xué)習(xí)資料】
查看更多關(guān)于“php培訓(xùn)資訊”的相關(guān)文章>>