redis 内部数据结构 dict
这是 《redis 七种内部数据结构》:https://www.cnblogs.com/christmad/p/11364372.html 的第一篇
简介:
dict 是 redis 的散列表实现。作为散列表的一种实现,它和 Java HashMap 有很多共同之处,也有不同的地方。不同之处在于:由于 redis 作为一个中心式缓存使用,dict 将会存储成千上万的 key,再考虑到 redis 的单线程模型,不希望在 rehash 时间点阻塞太长时间而导致其他命令无法执行。这些原因使得 dict 的扩容机制不得不放弃一次性扩容方法,而使用了一种叫做“渐进式扩容”的方式。
渐进式扩容,是将扩容时一次性的搬移工作,划分为最小单位搬移(每次步进 1~10个桶),并将其分散到发生扩容后对 dict 的每一次查询、更新、删除操作中;辅以定时任务(100ms 启动一次)帮助 redis 即使在闲时也能将 rehash 过程持续进行下去(rehash 完才能释放旧散列表的内存)。区别于一次性扩容的高 CPU 占用,渐进式扩容使 CPU 占用降到了常量级指令数量级别,使得 redis 单线程模型得以为继。为了实现渐进式扩容,dict 还设计了双散列表,在代码中都很容易发现。
2019-09-13 更新:补充 dict 扩容时 load factor 的小结,在图片最底部