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   太白金星有点烦  阅读(122)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2021-10-20 8.事务是隔离还是不隔离?

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示