有时候需要在成千上万的实例key中找到特定前缀的key来进行数据的处理。但是如何在海量的key中找到满足特定条件的key呢?
keys指令:用来列出所有满足特定正则字符串规则的key。
缺点:没有limit参数,一次性显示出所有满足条件的key,如果数据量比较大的时候,redis是单线程的,其他的指令会延后,造成redis服务卡顿。
scan指令
1、复杂度虽然也是 O(n),但是它是通过游标分步进行的,不会阻塞线程;
2、提供 limit 参数,可以控制每次返回结果的最大条数,limit 只是一个 hint,返回的结果可多可少;
3、同 keys 一样,它也提供模式匹配功能;
4、服务器不需要为游标保存状态,游标的唯一状态就是 scan 返回给客户端的游标整数;
5、返回的结果可能会有重复,需要客户端去重复,这点非常重要;
6、遍历的过程中如果有数据修改,改动后的数据能不能遍历到是不确定的;
7、单次返回的结果是空的并不意味着遍历结束,而要看返回的游标值是否为零
scan提供了三个参数,第一个是cursor 整数值,第二个是key 的正则模式,第三个是遍历的limit hint。第一次遍历时,cursor值为0,然后将返回结果中第一个整数值作为下一次遍历的cursor,一直遍历到返回的cursor值为0时结束。
上面的 count 1000不是返回的条数,而是限定服务器单次遍历的字典槽位数量,因为不是所有的槽位上都有挂接链表,有些槽位可能是空的,也有些槽位上有多个元素,每一次遍历都会将limit数量的槽位上挂接的所有元素进行模式匹配过滤后,一次性返回给客户端。
大key扫描:redis-cli
redis提供给了redis-cli命令:redis-cli -h 127.0.0.1 -p 7001 –-bigkeys,如果担心该指令会大幅提升redis的ops,可以增加一个休眠的参数:redis-cli -h 127.0.0.1 -p 7001 –-bigkeys -i 0.1