redisdb结构.jpg

redis 全局实例,定义了一个 dict实例。其中会有2个dicttable。redisObject

redis解决hash冲突,是通过数组+链表的方式。因为所有的数据,都是放在这个全局dict中。如果需要扩容,直接将原有数据全部复制到新的dicttable中,会导致性能很慢。
如果需要扩容,设计到2部分数据。
历史数据迁移和新插入数据。

  1. 历史数据迁移,不是一次性迁移,而是每次迁移,这就是渐进式的由来。根据rehashidx,来获取当前迁移的进度。
  2. 新数据,直接放到新的dicttable中即可。
    查询的时候,直接先从dicttable[0]查询,如果没空,在到新的dicttable[1]查询。

资料

02 数据结构:快速的Redis有哪些慢操作?