關於redis bit操作的原理bitmap(重要)
1byte(字節)=8bits (位|比特) utf8 一個漢字三字節即24bits UTF-32編碼中 世界上任何字符的存儲都需要4個字節

①ASCII碼中,一個英文字母(不分大小寫)占一個字節的空間,一個中文漢字占兩個字節的空間。一個二進制數字序列,在計算機中作為一個數字單元,一般為8位二進制數,換算為十進制。最小值0,最大值255。 ②UTF-8編碼中,一個英文字符等於一個字節,一個中文(含繁體)等於三個字節。 ③Unicode編碼中,一個英文等於兩個字節,一個中文(含繁體)等於兩個字節。 符號:英文標點占一個字節,中文標點占兩個字節。舉例:英文句號“.”占1個字節的大小,中文句號“。”占2個字節的大小。 ④UTF-16編碼中,一個英文字母字符或一個漢字字符存儲都需要2個字節(Unicode擴展區的一些漢字存儲需要4個字節)。 ⑤UTF-32編碼中,世界上任何字符的存儲都需要4個字節。 --------------------- 作者:自由自在_Yu 來源:CSDN 原文:https://blog.csdn.net/yuxiangaaaaa/article/details/78060661 版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
php字符串與二進制的轉換 (附phppack和unpack)

header("Content-type: text/html; charset=utf-8"); /** * 將字符串轉換成二進制 * @param type $str * @return type */ function StrToBin($str){ //1.列出每個字符 $arr = preg_split('/(?<!^)(?!$)/u', $str); //2.unpack字符 foreach($arr as &$v){ $temp = unpack('H*', $v);//從二進制字符串對數據進行解包(H十六進制字符串,高位在前) $v = base_convert($temp[1], 16, 2); if(strlen($v)<8){ $v=str_pad(strval($v), 8,0,STR_PAD_LEFT);//向左邊填充0補齊8個 } unset($temp); } return join(' ',$arr); } /** * 講二進制轉換成字符串 * @param type $str * @return type */ function BinToStr($str){ $arr = explode(' ', $str); foreach($arr as &$v){ $v = pack("H".strlen(base_convert($v, 2, 16)), base_convert($v, 2, 16)); } return join('', $arr); }
按位操作符:
redis DB 概念:

redis有沒有什么方法使不同的應用程序數據彼此分開同時又存儲在相同的實例上呢?就相當於mysql數據庫,不同的應用程序數據存儲在不同的數據庫下。 redis下,數據庫是由一個整數索引標識,而不是由一個數據庫名稱。 默認情況下,一個客戶端連接到數據庫0。 redis配置文件中下面的參數來控制數據庫總數:databases 16 可以通過下面的命令來切換到不同的數據庫下 select 2 隨后,所有的命令將使用數據庫3,知道你明確的切換到另一個數據庫下。 每個數據庫都有屬於自己的空間,不必擔心之間的key沖突。 不同的數據庫下,相同的key取到各自的值。 flushdb命令清除數據,只會清除當前的數據庫下的數據,不會影響到其他數據庫。 flushall命令會清除這個實例的數據。在執行這個命令前要格外小心。
通用:
rawCommand -對服務器執行任何通用命令
$redis->rawCommand("set", "foo", "bar");//true $redis->rawCommand("get", "foo"); $redis->rawCommand("rpush", "mylist", "one", 2, 3.5));//3 $redis->rawCommand("lrange", "mylist", 0, -1);// ["one", "2", "3.5000000000000000"]
Connection
$redis = new Redis(); $redis->connect('127.0.0.1',6379,1);//短鏈接,本地host,端口為6379,超過1秒放棄鏈接 返回boolean $redis->open('127.0.0.1',6379,1);//短鏈接(同上) $redis->pconnect('127.0.0.1',6379,1);//長鏈接,本地host,端口為6379,超過1秒放棄鏈接 返回boolean $redis->popen('127.0.0.1',6379,1);//長鏈接(同上) $redis->auth('password');//登錄驗證密碼,返回boolean【true | false】 $redis->select(0);//選擇redis庫,0~15 共16個庫 返回boolean $redis->swapdb(0, 1);//切換 DB 0 到 DB 1 v4.0++ $redis->close();//釋放資源 要釋放長鏈接版本要大於4.2+ 返回boolean $redis->ping(); //檢查是否還再鏈接,[成功返回+pong,否則拋出一個錯誤] setOption:設置客戶端選項: 例子: $redis->setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_NONE); // 不要序列化數據 $redis->setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_PHP); // 使用內置的序列化/反序列化 $redis->setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_IGBINARY); // 使用igBinary serialize/unserialize $redis->setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_MSGPACK); // 使用msgpack serialize/unserialize $redis->setOption(Redis::OPT_PREFIX, 'myAppName:'); // 在所有鍵上使用自定義前綴 /* 命令家族的選項,指示是否從用戶抽象空結果。如果設置為SCAN_NORETRY(默認值),phpredis每次只發出一個掃描命令, 有時返回一個空數組的結果。如果設置為SCAN_RETRY, phpredis將重試scan命令,直到返回鍵或Redis返回一個0迭代器 */ $redis->setOption(Redis::OPT_SCAN, Redis::SCAN_NORETRY); $redis->setOption(Redis::OPT_SCAN, Redis::SCAN_RETRY); getOption:獲取客戶端選項 /*返回 Redis::SERIALIZER_NONE, Redis::SERIALIZER_PHP, Redis::SERIALIZER_IGBINARY, or Redis::SERIALIZER_MSGPACK其中一個 */ $redis->getOption(Redis::OPT_SERIALIZER); $redis->echo('原樣返回');//將字符串發送給ReDIS,用相同的字符串回復
Server
$redis->bgRewriteAOF();//異步重寫append-only文件 返回boolean $redis->bgsave();//異步把DB所有數據存儲到磁盤--dump.rdb文件中 返回boolean $redis->save(); //同步把DB所有數據存儲到磁盤--dump.rdb文件中 返回boolean $redis->slaveOf('10.0.1.7', 6379);動態更改從庫狀態(這里將本redis庫設置為10.0.0.7 6379 的從庫)重新啟動之后,他們之間的復制關系將終止。
如果希望長期保證這兩個服務器之間的Replication關系,可以在該配置文件中做如下修改:slaveof 10.0.0.7 6379 /* 參數為主庫master的host(字符串)和主庫master的port(int),或者沒有參數停止作為從屬庫。 */ $redis->slaveOf(); $redis->config("GET", "*max-*-entries*");//獲取Redis服務器配置參數 文檔 返回key-value關聯數組 $redis->config("SET", "dir", "/var/run/redis/dumps/");//設置Redis服務器配置參數 返回boolean $redis->dbSize();//返回當前庫中的key的個數 $redis->flushAll();//清空整個redis[返回總是true] 4.0.0+版本有個可選的參數為boolean值 是否異步執行 $redis->flushDB();//清空當前redis庫[返回總是true] 4.0.0+版本有個可選參數為boolean值 是否異步執行 $redis->info();//查詢當前redis的狀態 [verson:2.4.5....] /*返回提供有關服務器信息的關聯數組。不向INFO傳遞任何參數將調用標准的REDIS INFO命令,該命令返回如下信息 redis_version、arch_bits、uptime_in_seconds、uptime_in_days、connected_clients、connected_slaves、used_memory、changes_since_last_save、bgsave_in_progress、last_save_time、total_connections_received、total_commands_processed、role*/ //您可以將各種選項傳遞給INFO(根據Redis文檔給定的內容),這將返回的參數指定的內容如: $redis->info("CPU"); /*只返回指定的cpu信息 */ $redis->lastSave();//上次存儲時間key的時間戳[timestamp] $redis->resetStat();//重置info方法返回的統計信息 返回boolean $redis->time();//返回當前服務器時間 如果成功,時間將作為關聯數組返回,其中元素0是unix時間戳,元素1是微秒 //訪問Redis slowLog $redis->slowLog('操作字符[GET/LEN/RESET]', 操作字符為GET時指定返回的長度即數目); // 獲取十個slowLog條目 $redis->slowLog('get', 10); //獲取默認的slowLog $redis->slowLog('get'); //重置slowLog $redis->slowLog('reset'); // 檢索slowLog長度 $redis->slowLog('len');
List
/*List棧的結構,注意表頭表尾,創建更新分開操作 l表示頭部 r表示尾部 b表示阻塞式*/ $redis->lPush('key','value');//增,只能將一個值value插入到列表key的表頭,不存在就創建 [列表的長度 |false] $redis->rPush('key','value');//增,只能將一個值value插入到列表key的表尾,不存在就創建 [列表的長度 |false] $redis->lInsert('key', Redis::BEFORE | Redis::AFTER, 'value', 'new_value');//增,將值value插入到列表key當中,位於值value之前或之后。[new_len | false] $redis->lPushx('key','value');//增,只能將一個值value插入到列表key的表頭,不存在不創建 [列表的長度 |false] $redis->rPushx('key','value');//增,只能將一個值value插入到列表key的表尾,不存在不創建 [列表的長度 |false] $redis->lPop('key');//刪,移除並返回列表key的頭元素,[被刪元素 | false] $redis->rPop('key');//刪,移除並返回列表key的尾元素,[被刪元素 | false] $redis->lRem('key','value',0);//刪,根據參數count的值,移除列表中與參數value相等的元素count=(0|-n表頭向尾|+n表尾向頭移除n個value) [被移除的數量 | 0] $redis->lTrim('key',start,end);//刪,列表修剪,保留(start,end)之間的值 [true|false] $redis->lSet('key',index,'new_v');//改,從表頭數,將列表key下標為第index的元素的值為new_v, [true | false] $redis->lIndex('key',index);//查,返回列表key中,下標為index的元素[value|false] $redis->lRange('key',0,-1);//查,(start,stop|0,-1)返回列表key中指定區間內的元素,區間以偏移量start和stop指定。[array|false] $redis->lLen('key');//返回列表key的長度,不存在key返回0, [ len | 0] $redis->lSize('key');//返回列表key的長度,不存在key返回0, [ len | 0] blPop() //刪,阻塞式移除並返回列表key的頭元素,[被刪元素 | false] brPop() //刪,阻塞式移除並返回列表key的尾元素,[被刪元素 | false] bRPopLPush(listkey1,listkey2,500) - 阻塞式的從列表中移除最后一個元素,將其推附加到另一個列表頭部並返回它 rPopLPush - 從列表中移除最后一個元素,將其附加到另一個列表頭部並返回它(redis> = 1.1) //bRPopLPush和rPopLPush是為了解決lpush與rpop的隊列業務時取出消息時客戶端崩潰導致數據丟失; //bRPopLPush和rPopLPush不僅返回一個消息,同時還將這個消息添加到另一個備份列表當中降低容錯率; //當一個客戶端完成某個消息的處理之后,可以用 LREM key count value 命令將這個消息從備份表刪除。 //最后,還可以添加一個客戶端專門用於監視備份表, //它自動地將超過一定處理時限的消息重新放入隊列中去(負責處理該消息的客戶端可能已經崩潰),這樣就不會丟失任何消息了 $redis->lpush('list_key1','value1'); $redis->lpush('list_key1','value2'); $redis->lpush('list_key1','value3'); $value=$redis->rPopLPush('list_key1', 'list_key2');//將list_key1的最后一個移到list_key2(備份列表)的前面並返回該值 if($service){ //如果出里的業務成功則移除備份列表的這個值 $redis->lRem('list_key2',1,$value); }else{ //失敗將該值繼續推送到list_key1的頭部 $redis->lpush('list_key1',$value); } //另一個監視備份列表的腳本 它自動地將超過一定處理時限的消息重新放入隊列中去(一般是崩潰情況) $c=$redis->object("idletime", "list_key2"); //→ 400 這個只能查詢list_key2的空閑時間 並不能實時的監控某個值的情況,當有其他值變化時會刷新這個時間
Set
/*Set,沒有重復的member,創建更新同操作*/ $redis->sAdd('key','value1','value2','valuen');//增,改,將一個或多個member元素加入到無序集合key當中,已經存在於集合的member元素將被忽略。[insert_num] $redis->sRem('key','value1','value2','valuen');//刪,移除無序集合key中的一個或多個member元素,不存在的member元素會被忽略 [del_num | false] $redis->sMembers('key');//查,返回無序集合key中的所有成員 [array | ''] $redis->sGetMembers('key');//查 返回無序集合中的所有成員 $redis->sIsMember('key','member');//判斷member元素是否是集合key的成員 [1 | 0] $redis->sPop('key');//刪,移除並返回集合中的一個隨機元素 [member | false] $redis->sRandMember('key');//查,返回集合中的一個隨機元素 [member | false] $redis->sInter('key1','key2','keyn');//查,返回所有給定集合的交集 [array | false] $redis->sUnion('key1','key2','keyn');//查,返回所有給定集合的並集 [array | false] $redis->sDiff('key1','key2','keyn');//查,返回所有給定集合的差集 [array | false] $redis->sCard('key');//返回集合key的基數(集合中元素的數量)。[num | 0] $redis->sMove('key1', 'key2', 'member');//移動,將member元素從key1集合移動到key2集合。[1 | 0] sDiffStore(destination,key1,key2,keyn) - 保存指定key的差集到destination集合並返回,destination存在則覆蓋 destination 可以是 key 本身 $redis->sAdd('s0', '1'); $redis->sAdd('s0', '2'); $redis->sAdd('s0', '3'); $redis->sAdd('s0', '4'); $redis->sAdd('s1', '1'); $redis->sAdd('s2', '3'); $redis->sDiffStore('dst', 's0', 's1', 's2'); $redis->sMembers('dst');//[4,2] //sInterStore(newkey,key1,key2,keyn) - 執行sInter命令(交集)並將結果存儲在新集合newkey中 $redis->sAdd('key1', 'val1'); $redis->sAdd('key1', 'val2'); $redis->sAdd('key1', 'val3'); $redis->sAdd('key1', 'val4'); $redis->sAdd('key2', 'val3'); $redis->sAdd('key2', 'val4'); $redis->sAdd('key3', 'val3'); $redis->sAdd('key3', 'val4'); $redis->sInterStore('output', 'key1', 'key2', 'key3'); $redis->sMembers('output');//['val3','val4'] sUnionStore(newkey,key1,key2,keyn) //執行sUnion命令(並集)並將結果存儲在新集合newkey中 //sScan(key,iterator,key's_pattern,count) - 迭代無需集合的key(替代阻塞的keys*) $it = NULL; $redis->setOption(Redis::OPT_SCAN, Redis::SCAN_RETRY); // don't return empty results until we're done while($arr_mems = $redis->sScan('set', $it, "*pattern*")) { foreach($arr_mems as $str_mem) { echo "Member: $str_mem\n"; } } $it = NULL; $redis->setOption(Redis::OPT_SCAN, Redis::SCAN_NORETRY); // return after each iteration, even if empty while(($arr_mems = $redis->sScan('set', $it, "*pattern*"))!==FALSE) { if(count($arr_mems) > 0) { foreach($arr_mems as $str_mem) { echo "Member found: $str_mem\n"; } } else { echo "No members in this iteration, iterator value: $it\n"; } }
Zset
/*Zset,沒有重復的member,有排序順序,創建更新同操作*/ $redis->zAdd('key',$score1,$member1,$scoreN,$memberN);//增,改,將一個或多個member元素及其score值加入到有序集key當中。[num | 0]注意存其他類型的key與key同名時會放棄添加 $redis->zRem('key','member1','membern');//刪,移除有序集key中的一個或多個成員,不存在的成員將被忽略。[del_num | 0] $redis->zScore('key','member');//查,通過值反拿權 [num | null] $redis->zRange('key',$start,$stop);//查,通過位偏移范圍(索引)拿member值,返回有序集key中指定偏移量分為的的成員,score從低到高排列 [array | null] $redis->zRevRange('key',$start,$stop);//查,通過位偏移范圍(索引)拿member值,返回有序集key中指定偏移量分為的的成員,score從高到底排列 [array | null] $redis->zRangeByScore('key',$min,$max[,$config]);//查,通過scroe權范圍拿member值,返回有序集key中,指定區間內的(從小到大排)成員[array | null] $redis->zRevRangeByScore('key',$max,$min[,$config]);//查,通過scroe權范圍拿member值,返回有序集key中,指定區間內的(從大到小排)成員[array | null]

$redis->zAdd('key1', 100, 'val0'); $redis->zAdd('key1', 101, 'val1'); $redis->zAdd('key1', 102, 'val2'); $redis->zAdd('key1', 103, 'val3'); $redis->zAdd('key1', 104, 'val4'); $redis->zAdd('key1', 105, 'val5'); $redis->zAdd('key1', 106, 'val6'); $redis->zAdd('key1', 107, 'val7'); $redis->zAdd('key1', 108, 'val8'); $redis->zAdd('key1', 109, 'val9'); $redis->zAdd('key1', 110, 'val10'); $redis->zAdd('key1', 111, 'val11'); $res1=$redis->zRange('key1', 0, -1); //['val0','val1',...,'val11'] $res3=$redis->zRange('key1', 0, -1, false); //['val0','val1',...,'val11'] $res2=$redis->zRange('key1', 0, -1, true); //['val0'=>100,'val1'=>101,...,'val11'=>111] $res4=$redis->zRevRange('key1', 0, -1, true); //['val11'=>111,'val10'=>110,...,'val0'=>100] $res=$redis->zRevRange('key1', 0, -1); //['val11','val10',...,'val0'] $index=2; $count=5; $res5=$redis->zRangeByScore('key1', 0, 111); //['val0','val1',...,'val11'] $res6=$redis->zRangeByScore('key1', 100, 111, ['withscores' => TRUE,'limit' => [$index, $count]]); //['val2','val1',...,'val6'] $res7=$redis->zRevRangeByScore('key1', 0, 111); //為什么返回的是空數組? $res8=$redis->zRevRangeByScore('key1', 100, 111, ['withscores' => TRUE,'limit' => [$index, $count]]); //為什么返回的是空數組?
$redis->zRank('key','member');//查,返回有序集中指定成員的排名(索引)。其中有序集成員按分數值遞增(從小到大)順序排列[order | null] $redis->zrevrank('key','member');//查,返回有序集合中指定成員的排名(索引),有序集成員按分數值遞減(從大到小)排序[order | null] $redis->zCard('key');//返回集合key的基數(集合中元素的數量)。[num | 0] $redis->zCount('key',0,-1);//返回有序集key中,score值在min和max之間(默認包括score值等於min或max)的成員數量。[num | 0] //zIncrBy(key,score,value) - 按給定的值自增score分 返回double類型的score總值 $redis->zIncrBy('key', 1, 'member1'); // 1 $redis->zIncrBy('key', 2.5, 'member1'); // 3.5 zInter(newkey,arrayZSetKeys=[k1,k2,kn], arrayWeights=[score1,score2,scoren],aggregateFunction ='SUM|MAX|MIN') //保存 k1~kn有序集合的交集 到newkey中,並返回並集新集合成員的個數 //zInter('newkey', ['k1', 'k2'], [1, 1],'SUM');//第三個參數arrayWeights的默認值每個都為1,第四個參數aggregateFunction默認為SUM //newkey元素的score計算規則 //當第四個參數為sum時:(arrayZSetKeys[0]_score*arrayWeights[0])+(arrayZSetKeys[1]_score*arrayWeights[1])+(arrayZSetKeys[n]_score*arrayWeights[n]) //當第四個參數為max時: max(arrayZSetKeys[0]_score,arrayZSetKeys[1]_score,arrayZSetKeys[n]_score)*max(arrayWeights[0],arrayWeights[1],arrayWeights[n]) //當第四個參數為min時: min(arrayZSetKeys[0]_score,arrayZSetKeys[1]_score,arrayZSetKeys[n]_score)*min(arrayWeights[0],arrayWeights[1],arrayWeights[n]) $redis->delete('k1');$redis->delete('k2');$redis->delete('k3'); $redis->delete('ko1');$redis->delete('ko2');$redis->delete('ko3');$redis->delete('ko4'); //k1=>[[0.0,val0],[1.0,val1],[3.0,val3]] $redis->zAdd('k1', 0, 'val0'); $redis->zAdd('k1', 1, 'val1'); $redis->zAdd('k1', 3, 'val3'); //k2=>[[2.0,val1],[3.0,val3]] $redis->zAdd('k2', 2, 'val1'); $redis->zAdd('k2', 3, 'val3'); $a=$redis->zInter('ko1', ['k1', 'k2']); //返回 2 此時:'ko1' => [[3.0,val1],[6.0,val3]] 1*1+2*1 3*1+3*1 $b=$redis->zInter('ko2', ['k1', 'k2'], [1, 1]); // 2, 'ko2' => [[3.0,val1],[6.0,val3]] 1*1+2*1 3*1+3*1 $b=$redis->zInter('ko5', ['k1', 'k2'], [1, 10]); // 2, 'ko5' => [[21.0,val1],[33.0,val3]] (1*1)+(2*10) (3*1)+(3*10) $b=$redis->zInter('ko6', ['k1', 'k2'], [1, 10],'SUM'); // 2, 'ko6' => [[21.0,val1],[33.0,val3]] (1*1)+(2*10) (3*1)+(3*10) $b=$redis->zInter('ko7', ['k1', 'k2'], [5, 10],'MIN'); // 2, 'ko7' => [[5.0,val1],[15.0,val3]] mim(1,2)*5 min(3,3)*5 $c=$redis->zInter('ko3', ['k1', 'k2'], [1, 5], 'min'); // 2, 'ko3' => [[1.0,val1],[3.0,val3]] min(1,2)*1 min(3,3)*1 $d=$redis->zInter('ko4', ['k1', 'k2'], [1, 5], 'max'); // 2, 'ko4' => [[10.0,val1],[15.0,val3]] max(1,2)*5 max(3,3)*5 zRangeByLex(key,min="-",max="+" [,index,count]) //返回相同score情況下指定有序集合鍵key的(介於min和max之間的)成員,按成員字典正序排序, 注意:分數必須相同 //min和max必須以[或者(開頭[:包含(:不包含 或者min可以有-表示最小 max有+表示最大 注意 排序的是ASCII編碼字符,utf8等其他字符排序不准確 //k1=>[a,b,...,g]; //zRangeByLex('key1','-','+');獲取所有zset集合 //zRangeByLex('key1','[a or(a','(c');獲取key1所有a-c之間的所有值包含a不包含c $redis->zRangeByLex('key','-','[c') // ['a','b','c']; $redis->zRangeByLex('key','-','(c') // ['a','b'] $redis->zRangeByLex('key','-','[c',1,2) // ['b','c'] 偏移從1開始且只返回兩個 //zRemRangeByRank(key,start,end), zDeleteRangeByRank(key,start,end) - 刪除所有有在索引(下標)start~end之間的有序集合返回刪除的個數 $redis->zAdd('key', 1, 'one'); $redis->zAdd('key', 2, 'two'); $redis->zAdd('key', 3, 'three'); $redis->zRemRangeByRank('key', 0, 1); //2 //zRemRangeByScore(key,score1,score2), zDeleteRangeByScore(key,score1,score2) - 刪除所有有在score權重排序分score1,score2之間的有序集合返回刪除的個數 $redis->zAdd('key', 0, 'val0'); $redis->zAdd('key', 2, 'val2'); $redis->zAdd('key', 10, 'val10'); $redis->zRemRangeByScore('key', 0, 3); //2 zUnion(newkey,arrayZSetKeys=[k1,k2,kn], arrayWeights=[score1,score2,scoren],aggregateFunction ='SUM|MAX|MIN') // 返回並集;用法同zInter //zScan(key,iterator,key_pattern,count) - 迭代有序集合 $it = NULL; $redis->setOption(Redis::OPT_SCAN, Redis::SCAN_RETRY); while($arr_matches = $redis->zScan('zset', $it, '*pattern*')) { foreach($arr_matches as $str_mem => $f_score) { echo "Key: $str_mem, Score: $f_score\n"; } }
Hash
/*Hash,表結構,創建更新同操作*/ $redis->hset('key','field','value');//增,改,將哈希表key中的域field的值設為value,不存在創建,存在就覆蓋【1 | 0】 $redis->hget('key','field');//查,取值【value|false】 $arr = array('one'=>1,2,3,'name'=>'tom',4);$arr2 = array('one',0,1,'name',2); $redis->hMset('key',$arr);//增,改,設置多值$arr為(索引|關聯)數組,$arr[key]=field, [ true ] $redis->hMget('key',$arr2);//查,獲取指定下標的field,[$arr | false] ["one"=>1,0=>2,1=>3,"name"=>"tom",2=>4] $redis->hGetAll('key');//查,返回哈希表key中的所有域和值。[當key不存在時,返回一個空表] $redis->hKeys('key');//查,返回哈希表key中的所有域。[當key不存在時,返回一個空表] $redis->hVals('key');//查,返回哈希表key中的所有值。[當key不存在時,返回一個空表] $redis->hDel('key',$arr2);//刪,刪除指定下標的field,不存在的域將被忽略,[num | false]
$redis->hExists('key','field');//查看hash中是否存在field,[1 | 0] $redis->hIncrBy('key','field',$int_num);//為哈希表key中的域field的值加上量(+|-)num,[new_num | false] $redis->hLen('key');//返回哈希表key中域的數量。[ num | 0]
//hIncrByFloat(key field increment) - 為哈希表key中的域field加上浮點數增量increment
$redis->hIncrByFloat('h','x', 1.5); //1.5
$redis->hIncrByFloat('h', 'x', 1.5); //3.0
//hSetNx(hash field value);-當且僅當第二個參數-[域:field]未存在於哈希表的情況下,將它的值設置為value,第一個參數hash不存在時新建 返回boolean
$redis->hSetNx('h', 'key1', 'hello');
hScan(key,cursor [,MATCH pattern] [,COUNT count]);// 迭代hash鍵 用法和作用同scan
hStrLen(key field);// 返回哈希表key中,與給定域field相關聯的值的字符串長度 返回number 0表示key或者field不存在
string
Strings //append -向指定的key追加值 $redis->set('key', 'hello'); $redis->append('key', 'world'); $redis->get('key'); //'helloworld' //setBit(key,offset,value) - 更改字符串(二進制)的單個位 (offset:位偏移 value:布爾、0或者1) 返回設置之前的位的值(0或者1) $redis->set('key', "*"); // ord("*") = 42(ASCII) = 0x2f(16進制) = 00101010(二進制) $redis->setBit('key', 5, 1); // 0 (00101110) $redis->setBit('key', 7, 1); // 0 (00101111) $redis->get('key'); // "/" $redis->getBit('key', 5); //1 返回指定某個鍵偏移量的值 $redis->bitCount('key'); //計算key 所儲存的字符串值中,被設置為 1 的比特位的數量 /* setBit 與bitCount實現用戶上線次數統計等計數 例子:記錄用戶上線了多少天 首先我們要知道網站的上線時間,沒過一天則位增加一個(8個才一個字節) 如今天是網站上線的101天 那么我們以用戶名為key 網站上線的天數為offset位偏移 用戶一上線就將位偏移設置為1 */ $redis->setBit(tom, 100, 1); //在網站上線的100天的那天登錄過(昨天) $redis->setBit(tom, 101, 1); //在網站上線的101天的那天登錄過(今天) //然后我們通過 bitCount統計tom的二進制位偏移有多少個1 (有多少個1就上線了幾天) $redis->bitCount('tom'); //tom上線了多少天 //bitOp - 在多個鍵上按位運算(redis現支持的按位操錄作符有: "AND", "OR", "NOT", "XOR") BITOP可能是一個緩慢的命令容易阻塞 $redis->set('k1', 'foobar'); $redis->set('k2', 'abcdef'); $a=$redis->bitOp('and','newkey','k1','k2');//6 `bc`ab $redis->get('newkey'); //`bc`ab /*過程: 1100110 1101111 1101111 1100010 1100001 1110010 1100001 1100010 1100011 1100100 1100101 1100110 按位與(and)之后: 1100000 1100010 1100011 1100000 1100001 1100010 (`bc`ab) */ //計算網站每日活躍用戶(登錄了多少用戶) $redis->setBit(active01, userid=1, 1); //每月1號為active01,..每月15號為active15 第二個參數用戶的id作為偏移量 只要用戶一登錄就執行這個設置偏移值為1 $redis->bitCount('active01');//計算昨天(1)號的在線人數 //計算網站每月活躍用戶(一個月內登陸的用戶去重總數)即可把30天的所有bitmap做or計算,然后再計算bitcount $redis->bitOp('or','month_active','active01','active02','...','active31'); //計算留存率(次日留存=昨天今天連續登的人數/昨天登錄的人數) //自減: $redis->decr(鍵,每次自減的位數默認1); //命令將 key 中儲存的數字值增一,如果 key 不存在,那么 key 的值會先被初始化為 0 ,然后再執行 INCR 操作,且將key的有效時間設置為長期有效 $redis->decr('key1', 10); $redis->decrBy(鍵,每次自減的位數默認1); //命令將 key 中儲存的數字加上指定的增量值,如果 key 不存在,那么 key 的值會先被初始化為 0 ,然后再執行 INCR 操作(命令用於為哈希表中的字段值加上指定增量值) $redis->decrBy('key1', 10); //自增:(同decr、decrBy) $redis->incr('key1',10); //假設key1 不存在, 自增前自動設置為0現在是0+10=10 $redis->incrBy('key1',10); //10+10=20 //incrByFloat -使用浮點精度自增自減 $redis->incrByFloat('key1', 1.5); //假設key1不存在 自增前自動賦值為0 現在是0+1.5=1.5 $redis->incrByFloat('key1', 1.5); //1.5+1.5=3 $redis->incrByFloat('key1', -1.5);//3-1.5=1.5 $redis->get('key'); //獲取redis某個鍵的值 //setRange(鍵,替換的起始位置,替換的字符) - 字符替換 $redis->set('key', 'Hello world'); $redis->setRange('key', 6, "redis"); //Hello redis $redis->setRange('key', 6, "my"); //Hello mydis //getRange(鍵, 開始位, 結束位); 返回指定范圍的字符串 $redis->getRange('key', 0, 5);//'Hello ' $redis->getRange('key', -5, -1); //'mydis' //getSet - 設置一個值並返回該鍵的上一個條目 $redis->set('x', '42'); $exValue = $redis->getSet('x', 'lol'); //返回'42' $newValue = $redis->get('x'); //返回'lol' //mGet, getMultiple - 獲取所有指定鍵的值。如果一個或多個鍵不存在,則數組在鍵的位置將包含FALSE $redis->set('key1', 'value1'); $redis->mGet(['key0', 'key1', 'key5']); //[`FALSE`, 'value1', `FALSE`]; 返回與鍵的值相關的數組 //mSet, mSetNX -批量設置鍵值 返回boolean $redis->mSet(['key0' => 'value0', 'key1' => 'value1']); $redis->mSetNX (['dada' => 'value0', 'xiaoxiao' => 'value1']);//當且僅當所有給定key全都不存在時才批量設置鍵值 返回boolean key0和key1都不存在才能設置,否則兩個都不會設置成功
//set(鍵,值,過期時間或者擴展數組) - 設置鍵的值。如果您使用Redis> = 2.6.12,則可以傳遞擴展選項 $redis->set('key','value', 10); //TTL, time to live(生存時間) //setEx, pSetEx - 將設置為指定key的值,並設置生存時間。 PSETEX使用TTL,以毫秒為單位 $redis->setEx('key', 3600, 'value'); // 設置鍵值, with 1h TTL. 以秒為單位 $redis->pSetEx('key', 100, 'value'); // 設置鍵值, with 0.1 sec TTL. 以毫秒為單位 //setNx - 鍵不存在才賦值 返回boolean $redis->setNx('key', 'value'); //TRUE $redis->setNx('key', 'value'); //FALSE //strLen(鍵) -獲取鍵對應字符串值的長度 $redis->set('key', 'value'); $redis->strlen('key'); // 5
Keys
Keys //del, delete, unlink - 刪除指定的鍵 返回刪除的鍵數 //unlink 用法同del一致 非阻塞的,並且將異步執行實際刪除 v4.0.0++ $redis->delete('key1', 'key2'); // 2 $redis->delete(['key1', 'key2']); // 2 //dump(鍵) -序列化給定 key的值,並返回;使用 RESTORE 命令可以將這個值反序列化 //restore(key,ttl,dump序列化的值) - 反序列化給定的dump提供的序列化值,並將它和給定的key關聯 $redis->set('foo', 'bar'); $val = $redis->dump('foo'); //返回序列化后的鍵值(在瀏覽器上亂碼無關緊要) bar����( $res=$redis->restore('foo-bar', 0, $val); // foo-bar鍵的值與foo鍵的值相同都為bar $a=$redis->get('foo'); $b=$redis->get('foo-bar'); //exists(string or array) - 檢查給定 key 是否存在 返回存在key的數量 版本<4.0.0則返回boolean $redis->exists('NonExistingKey'); //0 都不存在返回0 $redis->mset(['foo' => 'foo', 'bar' => 'bar', 'baz' => 'baz']); $redis->exists(['foo', 'bar', 'baz']);//3 // $redis->exists('foo', 'bar', 'baz');//3 //expire, setTimeout, pexpire -設定指定key的生存時間(s) 返回boolean $redis->set('x', '42'); $redis->setTimeout('x', 3); // 設置x3秒的存活時間 sleep(5); // 休眠5秒 $redis->get('x'); // 返回false x已經過期了 //expireAt, pexpireAt - 設定指定key生存時間(只接受10位數的時間戳) $redis->expireAt('x', time()+3);//3秒的生存時間時間 $redis->expireAt('x', 1577811600);//2020/01/01 00:00:00過期 //keys, getKeys - 返回滿足給定pattern的所有key ( 查看鍵的總數dbSize) $redis->keys('user'); $redis->keys('user*');//如user1... $redis->keys('*');//返回所有鍵 //scan - 迭代數據庫的鍵 (Redis >= 2.8.0) 實際生產中使用這個避免使用keys阻塞數據庫 $it=NULL; $count=1000;//不填第三個參數是返回所有匹配到的鍵 $match='active*';//匹配鍵 $arr_keys = $redis->scan($it,$match,$count); //與原生的redis scan有點區別 //仿原生: $it = null;//游標 $match = 'active*'; $count = 10; $index = 0; $redis->setOption(Redis::OPT_SCAN,Redis::SCAN_RETRY); $iterator = null; while ($keys = call_user_func_array(array($redis, 'scan'), array(&$it, $match,$count))) { echo $it. PHP_EOL.'<br>'; foreach ($keys as $key) { echo $key . PHP_EOL.'<br>'; } } //migrate(host,port,key/keys,targetDB(0~15),timeout,不移除源實例上的key(拷貝),替換目標實例上已存在的key) - 將key遷移到其他Redis實例 多個key遷移版本必須>=3.0.6 $redis->migrate('127.0.0.1', 6379, 'foo', 0, 3600); $redis->migrate('backup', 6379, 'foo', 0, 3600, true, true); // copy and replace $redis->migrate('backup', 6379, 'foo', 0, 3600, false, true); // just REPLACE flag /* 遷移多個keys (version >= 3.0.6) $redis->migrate('backup', 6379, ['key1', 'key2', 'key3'], 0, 3600); //move - 將key移動到其他數據庫 $redis->select(0); // switch to DB 0 $redis->set('x', '42'); // write 42 to x $redis->move('x', 1); // move to DB 1 $redis->select(1); // switch to DB 1 $redis->get('x'); // will return 42 //object(指定返回內容,key) 返回指定key的Redis對象的內部結構 //REFCOUNT: 返回給定key引用所儲存的值的次數。此命令主要用於除錯 //ENCODING:返回給定key所儲存的值所使用的內部編碼方式 //字符串raw(一般字符串)或int (為了節約內存,Redis 會將字符串表示的 64 位有符號整數編碼為整數來進行儲存) //列表:ziplist(是為節約大小較小的列表空間而作的特殊表示)或linkedlist; //集合:intset(是只儲存數字的小集合的特殊表示)或者hashtable; //哈希:zipmap(是小哈希表的特殊表示)或者hashtable; //有序集合:ziplist(用於表示小的有序集合)或者skiplist(用於表示任何大小的有序集合) //IDLETIME:返回給定 key 自儲存以來的空閑時間(idle, 沒有被讀取也沒有被寫入),以秒為單位 //返回值: REFCOUNT 和 IDLETIME 返回數字;ENCODING 返回相應的編碼類型;如果密鑰不存在則為FALSE。 $b=$redis->object("refcount", "month_active"); // → 1 $a=$redis->object("encoding", "active31"); // → raw $c=$redis->object("idletime", "active31"); //→ 400 //persist(鍵) - 移除給定key的生存時間(key變成永不過時的key)返回boolean $redis->persist('key'); //randomKey - 從當前數據庫中隨機返回(不刪除)一個 key $redis->randomKey();//隨機返回當前數據庫總的key //rename(舊鍵名,新鍵名), renameKey(舊鍵名,新鍵名) - 修改鍵名 返回boolean $redis->rename('x', 'y'); renameNx(舊鍵名,新鍵名) - 當修改的新鍵名不存在時才修改鍵名 //type(鍵名) - 返回指定key所儲存的值的類型 $redis->type('key'); //sort(參數) - 對列表、有序集合和無序集合中的元素進行排序 /* 參數有: 'by' => 'some_pattern_*', 'limit' => [0, 1], 'get' => 'some_other_pattern_*' or an array of patterns, 'sort' => 'asc' or 'desc', 'alpha' => TRUE, 'store' => 'external-key' */ $redis->delete('s'); $redis->sAdd('s', 5); $redis->sAdd('s', 4); $redis->sAdd('s', 2); $redis->sAdd('s', 1); $redis->sAdd('s', 3); $redis->sort('s'); // 1,2,3,4,5 $redis->sort('s', ['sort' => 'desc']); // 5,4,3,2,1 $redis->sort('s', ['sort' => 'desc', 'store' => 'out']); // (int)5 //ttl(鍵), pttl(鍵) -返回指定鍵的剩余生存時間 ttl(返回秒) pttl(返回毫秒) $redis->ttl('key');
事務
事務 multi, exec, discard - 進入和退出交易模式 $ret = $redis->multi(Redis::MULTI) ->set('key1', 'val1') ->get('key1') ->set('key2', 'val2') ->get('key2') ->exec();//array (true,'val1',true, 'val2') watch['key1','key2','keyn'] 監視其他客戶端是否修改制定的key 如果在WATCH和EXEC之間修改key,則MULTI/EXEC事務將失敗(返回FALSE) $redis->watch('x'); $ret = $redis->multi() ->incr('x') ->exec(); unwatch['key1','key2','keyn'] 取消 WATCH 命令對所有 key 的監視 如果在執行WATCH命令之后, EXEC命令或DISCARD命令先被執行了的話,那么就不需要再添加這個代碼執行UNWATCH了
發布/訂閱 顯示在前台頁面需要結合websoket
//模糊匹配訂閱(創建頻道) cli客戶端(訂閱者)
pSubscribe(patternArr function($redis, $pattern, $channel, $msg){}) - 訂閱一個或多個符合給定模式的頻道 re* 以re開頭的頻道; 回調中的任何非null返回值都將返回給調用者 //訂閱(創建頻道) cli客戶端(訂閱者) subscribe(channelArr,function($redis, $channel, $msg){},$instance) - 訂閱(給定的一個或多個)頻道的信息 此功能將來可能會發生變化 $redis->subscribe( ['channel-1', 'channel-2', 'channel-3'], function($redis, $channel, $msg){ echo $msg;//subscribe 是阻塞模式的,一直不會結束,這個腳本執行在瀏覽器是看不到信息的。除非你在下面加上die。。。,所以只能用cli運行模式 }, );
上面兩個訂閱是阻塞式的獨占鏈接,需要在后台掛起
//發布消息 cli客戶端(被訂閱者 無需獨占鏈接不是堵塞的) publish(channel, message) - 將信息message發送到指定的頻道channel(接收到信息message的訂閱者數量) 警告:此功能將來可能會發生變化 $redis->publish('chan-1', 'hello, world!'); // send message. pubSub($keyWord [,$argument]) - Introspection into the pub/sub subsystem 查看訂閱與發布系統狀態 返回一個由活躍頻道組成的列表 $argument:對於參數1是channels,您可以傳遞字符串模式,對於參數1是numsub 那么傳遞一個通道名稱數組 返回值根據keyWord的不同而不同 CHANNELS:返回一個數組,其中成員是匹配的頻道 NUMSUB:返回鍵/值數組,其中鍵是頻道名稱,值是它們的計數 NUMPAT:返回匹配的活躍訂閱的整數 $redis->pubSub("channels"); //所有頻道 $redis->pubSub("channels", "*pattern*"); //匹配包含pattern的頻道 $redis->pubSub("numsub", ["chan1", "chan2"]); //獲取'chan1' 和 'chan2'的訂閱者 $redis->pubSub("numpat"); //獲取匹配的訂閱者數
我是如何用redis做實時訂閱推送的
流streams
5.0 全新數據類型 數據流streams 看起來比pubsub可靠多的消息隊列。pubsub不靠譜? 很不靠譜,網絡一斷或buffer一大就會主動清理數據。stream的設計參考了kafka的消費組模型 以更抽象的方式建模日志的數據結構。Redis的streams主要是一個append only的數據結構,至少在概念上它是一種在內存中表示的抽象數據類型,只不過它們實現了更強大的操作,以克服日志文件本身的限制 如果你了解MQ,那么可以把streams當做MQ。如果你還了解kafka,那么甚至可以把streams當做kafka 這個功能有點類似於redis以前的Pub/Sub,但是也有基本的不同: streams支持多個客戶端(消費者)等待數據(Linux環境開多個窗口執行XREAD即可模擬),並且每個客戶端得到的是完全相同的數據 Pub/Sub是發送忘記的方式,並且不存儲任何數據;而streams模式下,所有消息被無限期追加在streams中,除非用於顯示執行刪除(XDEL) streams的Consumer Groups也是Pub/Sub無法實現的控制方式 streams數據結構本身非常簡單,但是streams依然是Redis到目前為止最復雜的類型,其原因是實現的一些額外的功能:一系列的阻塞操作允許消費者等待生產者加入到streams的新數據。另外還有一個稱為Consumer Groups的概念,這個概念最先由kafka提出,Redis有一個類似實現,和kafka的Consumer Groups的目的是一樣的:允許一組客戶端協調消費相同的信息流 stream適用於允許丟失數據的業務場景,因為redis本身是不支持數據的絕對可靠的,哪怕aof調成always Redis Stream——作為消息隊列的典型應用場景 https://segmentfault.com/a/1190000016777728 xAck($stream, $group, $arr_messages_ids) - 確認一條或多條待處理的消息 $redis->xAck('mystream_key', 'group1', ['1530063064286-0', '1530063064286-1']); xAdd($str_key, $str_id(* 代表redis自動生成流序列id), $arr_message) - 向流添加消息 返回添加消息的id $obj_redis->xAdd('mystream_key', "*", ['field' => 'value']);//1530063064286-0 xClaim($str_key, $str_group, $str_consumer, $min_idle_time, $arr_messages_ids, [$arr_options]) - 獲取待處理信息的所有權 返回消息ID數組以及相應的數據 $ids = ['1530113681011-0', '1530113681011-1', '1530113681011-2']; // 無options $obj_redis->xClaim( 'mystream', 'group1', 'myconsumer1', 0, $ids ); // 有 options $obj_redis->xClaim( 'mystream', 'group1', 'myconsumer2', 0, $ids, [ 'IDLE' => time() * 1000, 'RETRYCOUNT' => 5, 'FORCE', 'JUSTID' ] ); xDel(stream_key, $arr_messages_ids) - 從流中刪除消息 $redis->xDel('mystream', ['1530115304877-0', '1530115305731-0']); Group - 創建,銷毀或管理消費者群組 //創建 $redis->xGroup('CREATE', $str_key, $str_group, $str_msg_id, [$boo_mkstream]); //刪除 $redis->xGroup('DESTROY', $str_key, $str_group); //管理 $obj_redis->xGroup('HELP'); $obj_redis->xGroup('SETID', $str_key, $str_group, $str_msg_id); $obj_redis->xGroup('DELCONSUMER', $str_key, $str_group, $str_consumer_name); //刪除消費者 xInfo('CONSUMERS/GROUPS/STREAM/HELP', $str_stream, $str_group) - 獲取有關流的信息 xLen(stream_key) - 獲取流的總數據個數 xPending($str_stream, $str_group [, $str_start, $str_end, $i_count, $str_consumer]) - 檢查流中的待處理消息 $redis->xPending('mystream', 'mygroup', '-', '+', 1, 'consumer-1'); xRange($str_stream, $str_start, $str_end [, $i_count]) - 查詢流中的一系列消息 $redis->xRange('mystream', '-', '+', 2); xRead($arr_streams [, $i_count, $i_block) - 從流中讀取消息 $redis->xRead(['stream1' => '1535222584555-0', 'stream2' => '1535222584555-0']); //僅接收新消息(($=last id)並無限期等待一個新消息 $redis->xRead(['stream1' => '$'], 1, 0);
// xReadGroup($str_group, $str_consumer, $arr_streams [, $i_count, $i_block]) - 使用組和消費者一起讀取流消息 類似於xRead,但它支持讀取特定消費者組的消息 返回傳遞給此使用者組的消息(如果有) $redis->xReadGroup('mygroup', 'consumer2', ['s1' => 0, 's2' => 0], 1, 1000); xRevRange($str_stream, $str_end, $str_start [, $i_count]) - 查詢從start到end的一條或多條消息 $redis->xRevRange('mystream', '+', '-'); xTrim($str_stream, $i_max_len [, $boo_approximate])- 流裁剪為指定數量的項目 $obj_redis->xTrim('mystream', 100, true);
Geocoding 地理位置
Geocoding 地理位置 //geoAdd:將給定的空間元素(緯度、經度、名字)添加到指定的鍵里面。 這些數據會以有序集合的形式被儲存在鍵里面, 從而使得像 GEORADIUS 和 GEORADIUSBYMEMBER 這樣的命令可以在之后通過位置查詢取得這些元素 //geoAdd($key, $longitude(經度), $latitude(緯度), $name [, $longitude, $latitude, $member, ...]); $redis->del("myplaces"); $result = $redis->geoAdd( "myplaces", 37.773, -122.431, "San Francisco", -157.858, 21.315, "Honolulu" ); //geoHash(key,name1,name2,namen) 返回一個或多個位置元素的Geohash字符串 返回一個或多個元素組成的Geohash字符串數組 $hashes = $redis->geoHash("myplaces", "San Francisco", "Honolulu");//['87z9pyek3y0','8e8y6d5jps0'] //geoPos(key,name1,name2,namen):從鍵里面返回所有給定位置元素的位置(經度和緯度) 命令返回一個數組, 數組中的每個項都由兩個元素(j經度,緯度)組成 $positions = $redis->geoPos("myplaces", "San Francisco", "Honolulu")//[[37.773, -122.431],[-157.858, 21.315]] //GeoDist(key,name1,name2 [, $unit='m']):返回兩個給定位置之間的距離 unit包含m、km、mi(英里)、ft(英尺) $kilometers = $redis->geoPos("myplaces", "San Francisco", "Honolulu",'km')//168.2752 //geoRadius($key, $longitudee(經度), $latitude(緯度), $radius(半徑), $unit [, Array $options]):以給定的經緯度為中心, 返回鍵包含的位置元素當中, 與中心的距離不超過給定最大半徑radius距離的所有位置元素 $redis->geoRadius("hawaii", -157.858, 21.306, 300, 'mi'); $options['count'] = 1; $redis->geoRadius("hawaii", -157.858, 21.306, 300, 'mi', $options); //geoRadiusByMember($key, $name, $radius, $units [, Array $options]):作用和 geoRadius一樣只是原點是name決定而不是像geoRadius輸入經度和緯度來決定 $redis->geoRadiusByMember("myplaces", "Honolulu", 300, 'mi');
lua腳本
eval(script ,args_arr ,num_keys-int) - Evaluate a LUA script serverside 通過內置的Lua解釋器,對 Lua 腳本進行求值--評估LUA腳本服務器端 evalSha(script_sha_str,args_arr,num_keys_int) - 根據給定的 sha1 校驗碼,對緩存在服務器中的腳本進行求值 -- 從腳本的SHA1哈希值而不是腳本本身評估LUA腳本服務器端 script(model,script1,script2,scriptn) - 執行Redis SCRIPT命令以對腳本子系統執行各種操作 model包含: load: 將腳本script1~n添加到腳本緩存中,但並不立即執行這個腳本(eval會立即執行) 將在成功時返回傳遞腳本的SHA1哈希值,並在失敗時返回FALSE flush:清除所有 Lua 腳本緩存。 始終返回true kill:殺死當前正在運行的 Lua 腳本,當且僅當這個腳本沒有執行過任何寫操作時,這個命令才生效 如果腳本能夠被殺死則返回true,否則返回false exists:給定一個或多個腳本的 SHA1 校驗和,表示校驗和所指定的腳本是否已經被保存在緩存當中 將為每個傳遞的腳本返回一個TRUE或FALSE的數組 $redis->script('load', $script); $redis->script('flush'); $redis->script('kill'); $redis->script('exists', $script1, [$script2, $script3, ...]); client:使用各種參數發出CLIENT命令 Redis CLIENT命令可以以四種方式使用LIST、GETNAME、SETNAME [name]、KILL [ip:port] $redis->client('list'); // 獲取客戶端列表 返回包含客戶端信息的數組數組 $redis->client('getname'); // 獲取當前連接的名稱 返回客戶端名稱,如果沒有設置,則返回false $redis->client('setname', 'somename'); // 設置當前連接的名稱 如果可以設置則為true,否則為false $redis->client('kill', <ip:port>); // 通過ip:prot 殺死進程 如果客戶端可以被殺死則返回true,否則返回false getLastError - 最后一條錯誤消息(如果有的話) 包含上次返回的基於腳本的錯誤消息的字符串,如果沒有錯誤,則為NULL $redis->eval('this-is-not-lua'); $err = $redis->getLastError(); clearLastError - 清除最后一條錯誤消息 返回true $redis->set('x', 'a'); $redis->incr('x'); $err = $redis->getLastError(); // "ERR value is not an integer or out of range" $redis->clearLastError(); $err = $redis->getLastError(); _prefix(prefix) - 一種實用工具方法,用於為phpredis的前綴設置添加前綴 $redis->setOption(Redis::OPT_PREFIX, 'my-prefix:'); $redis->_prefix('my-value'); // Will return 'my-prefix:my-value' _unserialize(serialized_value) - 設置了使用任何序列化程序對數據進行反序列化的實用程序方法 $redis->setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_NONE); $redis->_serialize("foo"); // returns "foo" $redis->_serialize([]); // Returns "Array" $redis->_serialize(new stdClass()); // Returns "Object" $redis->setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_PHP); $redis->_serialize("foo"); // Returns 's:3:"foo";' _serialize(unserialized_value) - 設置了使用任何序列化程序序列化數據的實用程序方法 $redis->setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_PHP); $redis->_unserialize('a:3:{i:0;i:1;i:1;i:2;i:2;i:3;}'); // Will return [1,2,3]
Introspection 自我檢測
isConnected() :確定phpredis對象是否認為它已連接到服務器的方法 返回boolean getHost():檢索我們連接到的主機或unix套接字 getPort():獲取我們連接的端口 getDbNum():獲取phpredis指向的數據庫編號 getTimeout():獲取phpredis使用的(寫)超時 getReadTimeout():獲取指定給phpredis的讀取超時或如果我們沒有連接則為FALSE getPersistentID():獲取phpredis正在使用的持久ID getAuth():獲取用於驗證phpredis連接的密碼
多余:
$redis->ttl('key');//查看失效時間[-1 | timestamps] $redis->persist('key');//移除失效時間[ 1 | 0] $redis->sort('key',[$array]);//返回或保存給定列表、集合、有序集合key中經過排序的元素,$array為參數limit等!【配合$array很強大】 [array|false] /*2.共性的運算歸類*/ $redis->expire('key',10);//設置失效時間[true | false] $redis->move('key',15);//把當前庫中的key移動到15庫中[0|1] //string $redis->strlen('key');//獲取當前key的長度 $redis->append('key','string');//把string追加到key現有的value中[追加后的個數] $redis->incr('key');//自增1,如不存在key,賦值為1(只對整數有效,存儲以10進制64位,redis中為str)[new_num | false] $redis->incrby('key',$num);//自增$num,不存在為賦值,值需為整數[new_num | false] $redis->decr('key');//自減1,[new_num | false] $redis->decrby('key',$num);//自減$num,[ new_num | false] $redis->setex('key',10,'value');//key=value,有效期為10秒[true]$redis->watch('key','keyn');//監視一個(或多個) key ,如果在事務執行之前這個(或這些) key 被其他命令所改動,那么事務將被打斷 [true] $redis->unwatch('key','keyn');//取消監視一個(或多個) key [true] $redis->multi(Redis::MULTI);//開啟事務,事務塊內的多條命令會按照先后順序被放進一個隊列當中,最后由 EXEC 命令在一個原子時間內執行。 $redis->multi(Redis::PIPELINE);//開啟管道,事務塊內的多條命令會按照先后順序被放進一個隊列當中,最后由 EXEC 命令在一個原子時間內執行。 $redis->exec();//執行所有事務塊內的命令,;【事務塊內所有命令的返回值,按命令執行的先后順序排列,當操作被打斷時,返回空值 false】 /*4.String,鍵值對,創建更新同操作*/ $redis->setOption(Redis::OPT_PREFIX,'hf_');//設置表前綴為hf_ $redis->set('key',1);//設置key=aa value=1 [true] $redis->mset($arr);//設置一個或多個鍵值[true] $redis->setnx('key','value');//key=value,key存在返回false[|true] $redis->get('key');//獲取key [value] $redis->mget($arr);//(string|arr),返回所查詢鍵的值 $redis->del($key_arr);//(string|arr)刪除key,支持數組批量刪除【返回刪除個數】 $redis->delete($key_str,$key2,$key3);//刪除keys,[del_num] $redis->getset('old_key','new_value');//先獲得key的值,然后重新賦值,[old_value | false]