27. redis之scan

在巨大的数据量的情况下,做类似查找符合某种规则的key的信息

主要有两种方法:

第一种方法使用keys  命令,然后后面带上正则匹配,比如匹配 keys  redis*  -->匹配以redis开头的所有键,但是keys命令是以阻塞的方式执行的,keys是以遍历的方法实现的复杂度O(n),redis中的key越多,查找实现的代价就会越大,产生的阻塞时间就会越长。

第二种方法就是使用scan命令,它主要是基于游标迭代式批量进行遍历,因此不会阻塞主线程。

基本用法:

SCAN cursor [MATCH pattern] [COUNT count]
cursor - 游标。
pattern - 匹配的模式。
count - 指定从数据集里返回多少元素,默认值为 10 。
可用版本
>= 2.8.0

使用方法:

redis 127.0.0.1:6379> scan 0   # 使用 0 作为游标,开始新的迭代
1) "17"                        # 第一次迭代时返回的游标
2)  1) "key:12"
    2) "key:8"
    3) "key:4"
    4) "key:14"
    5) "key:16"
    6) "key:17"
    7) "key:15"
    8) "key:10"
    9) "key:3"
   10) "key:7"
   11) "key:1"
redis 127.0.0.1:6379> scan 17  # 使用的是第一次迭代时返回的游标 17 开始新的迭代
1) "0"
2) 1) "key:5"
   2) "key:18"
   3) "key:0"
   4) "key:2"
   5) "key:19"
   6) "key:13"
   7) "key:6"
   8) "key:9"
   9) "key:11"
 

对比keys 和scan的优缺点

keys:优点是一次性就能匹配出所有的键值,缺点是如果redis中有上亿个键,那么该命令会严重阻塞redis的主线程,导致redis服务暂时卡顿,业务不能正常使用

scan:有点是不能一次性匹配出所有的键值且匹配出的键值可能会有重复的,但是由于它是基于游标迭代式批量去取键值,所以它不会阻塞redis的主线程。

参考:https://blog.csdn.net/lxw1844912514/article/details/118526528

posted on 2022-10-20 22:54  太白金星有点烦  阅读(151)  评论(0)    收藏  举报

导航