最近在了解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或者其他槽,还需要再去看一下,也许是因为为了配对高位进位的方式
Redis的Scan粗略理解
最新推荐文章于 2023-12-06 15:18:16 发布