scan反向二进制位迭代原理:
顺序遍历会有什么问题?
在Redis中,key是使用Hash结构存储的,使用链表法解决hash冲突,需要遍历所有的key最直观的想法就是遍历hash数组,假设数组长度为8,则从0-7遍历取值即可。
但hash是会自动扩容缩容的,如果按照顺序遍历,在遍历一半的时候发生扩容缩容会发生什么?
如上图所示,原始数据遍历到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,问题是否解