scan命令的基本用法
cursor 用法
scan命令是一個基於遊標的迭代器(cursor based iterator): scan命令每次被調用以後, 都會向用戶返回一個新的遊標, 用戶在下次迭代時須要使用這個新遊標做爲 scan命令的遊標參數, 以此來延續以前的迭代過程。 當 scan命令的遊標參數被設置爲 0 時, 服務器將開始一次新的迭代, 而當服務器向用戶返回值爲 0 的遊標時, 表示迭代已結束。
示例
第一次迭代使用 0 做爲遊標, 表示開始一次新的迭代,第二次使用的是第一次迭代時返回的遊標。
scan命令的回覆是一個包含兩個元素的數組, 第一個數組元素是用於進行下一次迭代的新遊標, 而第二個數組元素則是一個數組, 這個數組中包含了全部被迭代的元素.
在第二次調用scan命令時,命令返回了遊標0,表示迭代已經結束,整個數據集已經遍歷完了。
以0做爲遊標開始一次新的迭代,一直調用scan命令,知道遊標返回0,咱們稱這個過程爲一次完整遍歷
match用法
和keys命令同樣,增量式迭代命令也能夠經過提供一個glob風格的模式參數,讓命令只返回和給定模式相匹配的元素,這一點能夠在執行增量式迭代命令時,經過給定MATCH<pattern>參數來實現
數據量比較少,因此加count限制掃描的元素,第一次沒有匹配到,因此是空的list,第二次迭代就找到對應的值了
COUNT
雖然增量式迭代不保證每次迭代所返回的元素數量,但咱們可使用count選項,count選項的做用是讓用戶告知迭代命令,在每次迭代中應該從數據集裏返回多少元素
雖然 COUNT 選項只是對增量式迭代命令的一種提示(hint), 可是在大多數狀況下, 這種提示都是有效的。
-
COUNT 參數的默認值爲 10 。
-
在迭代一個足夠大的、由哈希表實現的數據庫、集合鍵、哈希鍵或者有序集合鍵時, 若是用戶沒有使用 MATCH 選項, 那麼命令返回的元素數量一般和 COUNT 選項指定的同樣, 或者比 COUNT 選項指定的數量稍多一些。
-
在迭代一個編碼爲整數集合(intset,一個只由整數值構成的小集合)、 或者編碼爲壓縮列表(ziplist,由不一樣值構成的一個小哈希或者一個小有序集合)時, 增量式迭代命令一般會無視 COUNT 選項指定的值, 在第一次迭代就將數據集包含的全部元素都返回給用戶。
用戶能夠在每次迭代中按本身的須要隨意改變 COUNT 值, 只要記得將上次迭代返回的遊標用到下次迭代裏面就能夠了。
根據上面的介紹和例子,用php寫一段scan的用法
$redis = Cache::store('redis')->handler();
//$cursor = 0;//遊標,等於0沒有結果,坑
$cursor = null;
$redis->setOption(\Redis::OPT_SCAN,\Redis::SCAN_RETRY);
$arr = [];
while ($res = $redis->scan($cursor, '77dj_app:activity:4:*:135')) {
if (is_array($res)) {
$arr = array_merge($arr, $res);
}
}
var_dump($arr);exit;
可是始終返回的是空數組
看github上面的用法是cursor = null ,而後將cursor的0改成null,就有結果了