diff --git a/notes/Redis - 进阶.md b/notes/Redis - 进阶.md index a1f0de36..5b5a0298 100644 --- a/notes/Redis - 进阶.md +++ b/notes/Redis - 进阶.md @@ -28,7 +28,7 @@ - 字典中有两张哈希表 ht_table[0] 和 ht_table[1],平时只用 ht_table[0]; - 键的数量达到桶数时扩容,ht_table[1] 的大小为不小于键数加 1 的 2 的幂;有子进程在执行 BGSAVE 或 AOF 重写时,为了减少写时复制的内存页,要达到桶数的 4 倍才扩容; -- 键的数量不超过桶数的 1/8 时缩容,有子进程时要降到 1/32 才缩容,迁移过程与扩容相同; +- 键的数量不超过桶数的 1/8 时缩容,有子进程时要降到 1/32 才缩容,迁移过程与扩容相同。这些阈值是 Redis 7.4 的值(dict.c);7.2 及以前有子进程时,键数除以桶数的整数商要大于 5 才扩容,没有子进程时使用率低于 10% 才缩容; - rehashidx 记录迁移到了哪个桶,之后每次对这个字典增删改查,都顺便把一个桶中的所有键迁移到 ht_table[1]:访问的键所在的旧桶还没迁移时迁移这个桶,否则迁移 rehashidx 指向的桶;serverCron 也会定期花约 1 毫秒继续迁移; - 迁移期间新写入的键只放入 ht_table[1],查找和删除时两张表都可能要查; - 全部迁移完成后,ht_table[1] 变为 ht_table[0],rehashidx 恢复为 -1。