Redis 内存容量如何估算?为什么不能只看业务数据大小?
简化版
Redis 容量估算不能只算 value 大小,还要算 key、对象元数据、数据结构编码、字典开销、过期字典、复制缓冲、AOF/RDB rewrite COW、内存碎片和预留空间。生产上要用样本压测和 MEMORY USAGE 校准。
详细版
很多容量事故来自“业务数据 5GB,所以买 8GB Redis 应该够”。Redis 每个 key/value 都有对象头、字符串头、字典 entry 等额外开销,key 数越多,小 value 越明显。
估算要分三步:先抽样计算单条平均占用,再乘以数量和增长系数;然后加复制、持久化、碎片和峰值写入预留;最后用压测或线上影子数据验证。
如果开启主从、AOF rewrite、RDB 备份,还要给 fork/COW 留空间,否则平时看着够,一做持久化就可能内存报警。
完整版教学
一、为什么业务数据大小不等于 Redis 占用
Redis 存的不是裸字符串数组。每个 key 都需要字典结构定位,每个 value 也有对象包装和底层编码。key 名越长、key 数越多,元数据占比越高。
例如 1000 万个 key,每个业务 value 只有 20 字节,裸数据约 200MB。但加上 key 字符串、对象头、dict entry、对齐和 allocator 开销,实际可能远高于 200MB。
这就是小 value、大 key 数场景容易低估容量的原因。
二、如何做一个粗估算
容量估算可以先从样本开始。准备 1 万条接近真实的 key/value,写入测试 Redis,用 MEMORY USAGE 或 INFO memory 看平均占用。
MEMORY USAGE user:1001
INFO memory
假设抽样平均每条 350 字节,预计 2000 万条:
基础内存 = 350 × 20,000,000 ≈ 7GB
加 30% 碎片和增长 = 9.1GB
再加复制/持久化/COW 预留,实例可能要规划 14GB 以上
数字不需要绝对精确,但必须把隐藏开销纳入预算。
三、哪些因素会改变内存占用
key 长度、value 编码、集合元素数量、TTL、hash/list/set/zset 的内部编码都会影响内存。Redis 还会根据阈值在紧凑编码和普通结构之间转换。
| 因素 | 影响 | 示例 |
|---|---|---|
| key 名长度 | 每个 key 都重复存储 | user:profile:1001 比 u:p:1001 大 |
| 小 value 数量多 | 元数据占比高 | 20B value 可能实际占用百字节级 |
| zset/hash 大对象 | 结构开销高 | 排行榜、画像字段 |
| TTL | 多维护过期字典 | 大量带过期 key |
所以容量优化有时不是压缩 value,而是减少 key 数、缩短 key 名、合并小字段或调整数据结构。
四、为什么要预留持久化和复制空间
Redis 做 RDB 或 AOF rewrite 时可能 fork 子进程,写入期间触发 COW;主从复制也有复制缓冲;客户端慢消费还有输出缓冲。
如果机器 16GB,Redis 常态 used_memory 已经 14GB,一次 rewrite 加写入高峰就很危险。maxmemory 不等于进程实际不会超过,因为 RSS、碎片和 COW 都可能在外面。
稳妥做法是让常态内存低于机器内存明显一截,并监控 used_memory、used_memory_rss、mem_fragmentation_ratio、复制缓冲和 fork 指标。
五、容量规划要考虑增长和淘汰策略
容量不是一次性数字。缓存命中率提升、业务增长、活动流量、key 泄漏都会改变内存曲线。要给 3 个月或 6 个月增长留空间。
如果配置了 maxmemory-policy,达到上限后 Redis 会按策略淘汰 key。容量不足时不是“还能塞一点”,而是可能开始淘汰热点、造成命中率下降,进一步压垮数据库。
容量规划最终要和业务 SLO 绑定:命中率、延迟、可用内存、淘汰数量、过期数量都要看。
六、常见误区与追问
- 误区:Redis 内存等于 key/value 字符串长度之和。 元数据、字典、编码、碎片和缓冲都会占内存。
- 误区:设置 maxmemory 就不会 OOM。 进程 RSS、COW、复制缓冲和输出缓冲可能超过预期。
- 误区:key 名长一点没关系。 海量 key 下,每多 10 字节都会乘以千万级数量。
- 追问:如何估算最可靠? 用真实样本写入测试实例,结合
MEMORY USAGE和INFO memory校准。 - 追问:内存不足先做什么? 先定位 key 分布和增长来源,再考虑 TTL、数据结构、压缩、拆实例或扩容。
七、加强记忆
记忆钩子:Redis 容量像搬家,不只算家具体积,还要算包装箱、走廊、临时堆放区和搬运时的周转空间。
回答这题要把“样本估算 + 隐藏开销 + COW/缓冲预留 + 增长监控”讲出来。这样面试官会知道你不是只会背 Redis 是内存数据库,而是懂容量事故怎么来的。