redis的scan命令当有匹配模式的时候,会查询所有key吗?

工作中,突然想到了这个问题,记录下:

redis的scan命令,如果匹配模式为test*情况下,看以下哪种是正确的:

1 scan会遍历以test开头的key,获取这些key 。

2 scan会遍历所有的key,并过滤出以test开头的key ,

哪种是scan的原理呢? 

第2种是正确的,SCAN命令会遍历所有的key,并过滤出以特定模式开头的key。

Redis的SCAN命令是一个迭代器,它允许客户端逐步遍历数据库中的键。SCAN命令的基本语法如下:

SCAN cursor [MATCH pattern] [COUNT count]

  • cursor 是游标,用于分批次迭代。
  • pattern 是匹配的模式,用于指定一个glob风格的模式来过滤键。
  • count 是可选参数,用于指定每次迭代返回的元素数量,默认为10。

当使用MATCH选项时,SCAN命令会在服务器端根据给定的模式过滤键。这意味着只有与模式匹配的键才会被返回给客户端。因此,如果模式设置为test*,则SCAN命令将只返回以"test"开头的键。

需要注意的是,由于SCAN命令是基于游标的,所以在遍历过程中可能会出现重复的键。这是因为在遍历的过程中,数据库中的键可能会发生变化(如新增或删除),这可能会导致某些键在不同的迭代中被重复返回。因此,在使用SCAN命令时,客户端需要能够处理这种情况,以确保数据的完整性和准确性。

总结来说,SCAN命令是通过逐步遍历所有键并根据指定的模式进行过滤来实现的,而不是仅仅遍历匹配模式的键。这使得SCAN命令成为在生产环境中处理大量数据时的首选方法,因为它不会导致服务器阻塞,并且可以有效地管理内存使用。

redis scan count:count到底代表什么?

1. 用于指定每次迭代返回的元素数量

2. 用于每次迭代扫描的bucket数量

第二种是正确的。 count代表每次游标的bucket桶的数据量(redis内部是bucket桶数组+链式表存储结构):每次scan扫描的时候,会遍历这些桶,然后再遍历桶的链表元素

假设count=100,就代表遍历100个bucket桶,但是桶里面的链表可能有多个也可能没有,所以返回的元素就不一定是100个

另外redis scan每次返回的游标起始就是桶的游标,代表桶的位置,简单来说就是从哪个位置的桶接着遍历

参考连接:redis scan 命令底层原理(为什么会重复扫描?)_redis scan 命令原理-CSDN博客

Redis——Scan原理与应用_redis scan-CSDN博客

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值