由于每个Redis实例是使用单线程处理所有请求的,故keys命令和其他命令都是在同一个队列排队等待执行的,如果keys命令执行时间长(数量多),则会阻塞其他命令的执行,导致性能问题。
scan命令是在2.8及之后版本提供的,每次scan操作返回匹配的key的一个子集,这样每个scan请求的操作时间很短,多次scan请求之间可以执行其他命令,故减少对其他命令执行的阻塞,直到最后一个scan请求发现没有数据可返回了,则操作完成。由于scan命令需要执行多次,即相当于执行了多个命令,存在多次命令请求和响应周期,故整体执行时间可能要比keys命令长。
命令解释:scan 游标 MATCH count 每次迭代所返回的元素数量
SCAN命令返回的是一个游标,从0开始遍历,到0结束遍历。
通过scan中的MATCH 参数,可以让命令只返回和给定模式相匹配的元素,实现模糊查询的效果
127.0.0.1:6379> scan 0 match HBY* count 1000
1) "4065"
2) 1) "HBY_QUEUE_1211"
2) "HBY_QUEUE_1218"
3) "HBY_QUEUE_1208"
4) "HBY_QUEUE_1207"
5) "HBY_QUEUE_1205"
6) "HBY_QUEUE_1212"
7) "HBY_QUEUE_1214"
8) "HBY_QUEUE_1210"
9) "HBY_QUEUE_1216"
127.0.0.1:6379> scan 4065 match HBY* count 1000
1) "0"
2) 1) "HBY_QUEUE_1217"
2) "HBY_QUEUE_1209"
3) "HBY_QUEUE_1206"
4) "HBY_QUEUE_1215"
5) "HBY_QUEUE_1213"
如果定义的返回元素数量大于总的keys数量,那一下就可以match到了
127.0.0.1:6379> scan 0 match HBY* count 2000
1) "0"
2) 1) "HBY_QUEUE_1211"
2) "HBY_QUEUE_1218"
3) "HBY_QUEUE_1208"
4) "HBY_QUEUE_1207"
5) "HBY_QUEUE_1212"
6) "HBY_QUEUE_1214"
7) "HBY_QUEUE_1210"
8) "HBY_QUEUE_1216"
9) "HBY_QUEUE_1217"
10) "HBY_QUEUE_1209"
11) "HBY_QUEUE_1206"
12) "HBY_QUEUE_1215"
13) "HBY_QUEUE_1213"
注意:SCAN命令不能保证每次返回的值都是有序的,另外同一个key有可能返回多次,不做区分,需要应用程序去处理。