redis中hashtable 的 rehash/ resizing 策略

依赖于连续存储的数据结构(具体的,就是依赖array)都有一个resizing问题。对于vector,一般的策略就是满的时候double and copy,降到1/4时候 halve and copy。

Hashtable也可以这么做,均摊的复杂度模型是一样的。比如load factor (number of entry / hash table size) 大于5的时候触发 resize,创建一个double size的 新hash table,然后把所有的entry 迁移到新表。


redis把这个resize动作“物理均摊”,变成一个相对缓慢的过程,触发resize 条件之后置一个 isRehashing 标记,在rehashing 期间,每个基本操作put, get等都顺便把相应的entry迁移,并且有后台的线程也在分批次进行迁移。get 的 时候先从HT[0] get,没找到再从HT[1] get。


迁移结束后,ht[0] 指向 新的 hash table,置isReHashing 为false。

你可能感兴趣的:(系统分析设计,架构,数据存储和查找)