一、Redis rehash问题回顾
简单回顾下超出key阈值后,需要额外的hash表内存大小:
| 键值个数 | 需要额外的hash表内存大小 |
|---|---|
| 134,217,728 | 2GB |
| 67,108,864 | 1GB |
| 33,554,432 | 512.0MB |
| 16,777,216 | 256.0MB |
| 8,388,608 | 128.0MB |
| 4,194,304 | 64.0MB |
| 2,097,152 | 32.0MB |
| 1,048,576 | 16.0MB |
| 524,288 | 8.0MB |
随着key个数越多,rehash需要的额外内存也越大,所带来的可用性风险(大量逐出,Redis同步)和数据丢失(逐出)风险也越高。
二、Redis 6.2&7+ Rehash相关优化
Redis 6.2后对Rehash做了相关优化:
Limit the main db dictionaries expansion to prevent key eviction (#7954)
In the past big dictionary rehashing could result in massive data eviction.Now this rehashing is delayed (up to a limit), which can result in performance loss due to hash collisions.
简单翻译:
在大的hash表(键值数多)场景下,rehash会延迟执行防止大量数据丢失和可用性问题。
三、实验
1. 版本选择
-
Redis 6.0.15
-
Redis 7.0.11
2. 实验条件
-
maxmemory = 5.6GB
-
第一次灌入:67,100,000个key,观察内存
-
第二次灌入:2,000,000个key,观察可用性和逐出
3. 开始实验
(1) Redis 6.0.15
第一次灌入:67,100,000个key,观察内存:
maxmemory: 5.6GB
used_memory_human: 5.5GB
dbsize: 67,100,000
第
Redis6.2+优化:解决大dictrehash的可用性与逐出问题

文章回顾了Redis中当键值对超过阈值时rehash导致的额外内存需求和相关风险,并介绍了Redis6.2及以后版本对rehash的优化,如延迟执行以防止大规模数据逐出和可用性下降。实验结果显示,Redis7.0.11在处理大量键值对时显著减少了超时和数据逐出,提升了稳定性。
最低0.47元/天 解锁文章
356

被折叠的 条评论
为什么被折叠?



