java redis优化_Redis性能优化:使用scan命令替换keys

由于每个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有可能返回多次,不做区分,需要应用程序去处理。

由于每个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有可能返回多次,不做区分,需要应用程序去处理。
经验分享 程序员 微信小程序 职场和发展