摘自 https://juejin.cn/post/7027096770303754248
散列
即为哈希取余的方式
哈希冲突
采用链表法。
如果哈希桶内的链表太长,Redis采用rehash的方式解决,直白一点就是进行扩容。
rehash
Redis准备了两张表h1和h2,用于rehash时交替保存数据。
正常请求的时候,数据写入h1内,当进行rehash时,数据被迁移到h2内。迁移完成后,h1会被释放空间,并把h2的地址复制给h1,然后把h2的大小清空,这样就能继续使用h1存储数据。执行rehash时,扩容的大小为当前已用表空间的2倍。
由于执行rehash时,迁移大量数据会造成主线程阻塞,对性能有影响,Redis使用渐进式rehash的方法避免这种情况。Redis 并不会一次性的把所有的数据都进行迁移,而是每执行一次请求,就会顺带迁移部分数据,因为每次迁移的数据量很小,对主线程造成的影响也比较小,直到把所有数据都迁移完毕。