以前的項目中有用到redis的keys命令來獲取某些key,直到看了這篇文章
https://mp.weixin.qq.com/s/SGOyGGfA6GOzxwD5S91hLw。
安全起見,這次打算優化一下。官網建議使用scan命令來代替。於是就用了……
官網的scan命令介紹
http://doc.redisfans.com/key/scan.html
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,就有結果了

