redis scan反向二进制位迭代原理

scan反向二进制位迭代原理:


顺序遍历会有什么问题?

在Redis中,key是使用Hash结构存储的,使用链表法解决hash冲突,需要遍历所有的key最直观的想法就是遍历hash数组,假设数组长度为8,则从0-7遍历取值即可。

但hash是会自动扩容缩容的,如果按照顺序遍历,在遍历一半的时候发生扩容缩容会发生什么?

image-20220220100940334

如上图所示,原始数据遍历到index=5的位置。发生扩容后:从index=6的位置继续遍历,将会有8、10、27、12这四个元素被重复遍历;发生缩容后:7、12这两个元素将不会被遍历到。

何为反向二进制位迭代?

Redis的scan命令使用反向二进制位迭代顺序来解决这个问题,那这个反向二进制迭代顺序是怎样的?

假设数组长度为8,那么可以使用3个二进制位表示index,依次遍历顺序为:

# 第一次遍历依旧从0开始,下一次index为本次index的高位加一
000 -> 0
100 -> 4
010 -> 2
110 -> 6
001 -> 1
101 -> 5
011 -> 3
111 -> 7

按照这个顺序我们再结合上一张图看看,假设原数组已经遍历了0、4、2,问题是否解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值