以前的项目中有用到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,就有结果了