巧妙的思想

redis之hash扩容的渐进式哈希

哈希表是一个很常用的数据结构,哈希冲突也是非常常见的。常见的解决哈希冲突的方法有开放地址法、链地址法等。redis的hash采用的就是链地址法,同java的hashmap一样。

关于扩容,redis也有一个负载因子,当redis不在进行BGSAVE或这ReWriteAOF时,负载因子超过1就进行扩容;当redis在进行BGSAVE或者ReWriteAOF时,负载因子为5。扩容后的表大小为当前的2倍。

redis是单线程的,为了避免哈希表过大导致扩容阻塞,redis采取渐进式哈希,将表的扩容分发到表的增删改查操作中,redis的dict结构维护两个哈希表,一个用来存放数据,另一个用来扩容。并且redis的哈希表结构dict维护一个rehashidx,记录当前表的哈希位置。

redis的hash的实现结构

redis之intset的整数类型升级