Redis的Scan粗略理解

本文深入探讨Redis SCAN命令的工作原理,特别是在rehash过程中的表现。通过高位进位方式避免了重复和遗漏问题,确保了遍历的连续性和准确性。

 最近在了解redis的scan命令,scan就相当于分段遍历,遍历过程中出现rehash也能保证scan不重复和不遗漏,这两天了解这部分的原理,顺便记录一下。参考于RedisScan迭代器遍历操作原理(二)
 先说顺序遍历的问题,也就是按0,1,2,3……的顺序,用例子说明,当遍历完槽2的时候,返回下一个遍历的槽为3,槽2被rehash,一部分数据被挪到槽10,value(2) = value_rehash(2) 并 value_rehash(10),value函数就是返回某个槽里的值,当遍历到槽10的时候,此时的槽10已经是rehash之后的结果,取到的值与rehash之前的槽2取到的结果有部分重复。这是扩容的情况,缩容也是类似的情况,会出现漏掉key的情况。
 为了避免这些情况,redis采用了高位进位的方式,高位进位和地位进位类似,不会出现漏掉某个元素,遍历完槽2的时候(010),返回下一个遍历元素6(110),此时rehash,槽2(二进制0010)的元素被 部分挪到槽10(二进制1010),用高位进位递增的方式0110(十进制6)是不会递增到1010(十进制10)的,也就之后的递增都会跳过槽10,就避免了重复元素,缩容也是类似的。
 这只是我的粗略理解顺便记录一下,因为一开始理解这部分的时候看不懂在说什么,具体的redis为什么rehash后槽2的元素被挪到槽10而不是槽11或者其他槽,还需要再去看一下,也许是因为为了配对高位进位的方式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值