本文系统整理 Redis 内存排查的完整流程,涵盖最大内存配置、淘汰策略、大 Key 定位、内存碎片分析以及在线碎片整理。
一、查看 Redis 最大内存(maxmemory)配置
1️⃣ 查询最大内存限制
CONFIG GET maxmemory
返回说明
- 返回值单位:字节(Byte)
- 示例:
1) "maxmemory"
2) "8589934592"
表示 Redis 最大可使用内存为 8GB。
特殊情况说明
| 返回值 | 含义 |
|---|---|
0 |
不限制内存(默认值,⚠️ 生产环境不推荐) |
二、查看 Redis 内存淘汰策略(maxmemory-policy)
1️⃣ 查询当前淘汰策略
CONFIG GET maxmemory-policy
2️⃣ 常见淘汰策略说明
| 策略 | 说明 |
|---|---|
noeviction |
默认策略,内存满后写入直接报错 |
allkeys-lru |
对所有 key 按 LRU 算法淘汰(常用) |
volatile-ttl |
仅对设置了 TTL 的 key,优先淘汰快过期的 |
三、定位大 Key(BigKey)
大 Key 是 Redis 内存问题和性能问题的常见根源。
1️⃣ 使用 redis-cli 内置工具(推荐)
redis-cli --bigkeys
2️⃣ 工具说明
- 使用
SCAN方式遍历 key - 不会阻塞 Redis
- 自动按数据类型统计最大 key
3️⃣ 示例输出
Biggest string found 'user:token:1001' has 512000 bytes
Biggest hash found 'user:info:hash:1001' has 4200 fields
4️⃣ 结果解读
- string:关注 value 字节大小
- hash / list / set / zset:关注元素或 field 数量
四、查看 Redis 内存使用与碎片率
1️⃣ 查看内存信息
INFO MEMORY
2️⃣ 关键字段说明
used_memory:104857600
used_memory_rss:157286400
mem_fragmentation_ratio:1.50
mem_fragmentation_bytes:52428800
| 字段 | 含义 |
|---|---|
used_memory |
Redis 实际使用内存 |
used_memory_rss |
操作系统分配给 Redis 的内存 |
mem_fragmentation_ratio |
内存碎片率 |
mem_fragmentation_bytes |
内存碎片大小 |
3️⃣ 如何判断是否存在内存碎片问题?
| 碎片率 | 状态说明 |
|---|---|
< 1.1 |
正常 |
1.1 ~ 1.5 |
可接受 |
> 1.5 |
⚠️ 碎片偏高 |
> 2.0 |
❌ 严重问题,需处理 |
五、Redis 在线内存碎片整理(Redis 4.0+)
1️⃣ 查看是否开启碎片整理
CONFIG GET activedefrag
2️⃣ 开启在线碎片整理
CONFIG SET activedefrag yes
3️⃣ 查看碎片整理相关参数
CONFIG GET active-defrag*
说明:
- 在线碎片整理会消耗一定 CPU
- 建议在 碎片率较高且无法随意重启实例 的情况下开启
六、Redis 内存问题排查完整流程(实战总结)
1️⃣ 查看整体内存情况
INFO MEMORY
关注:
- 最大内存(maxmemory)
- 淘汰策略(maxmemory-policy)
- 当前内存使用量
- 内存碎片率(mem_fragmentation_ratio)
2️⃣ 未设置最大内存
CONFIG SET maxmemory 8gb
⚠️ 建议生产环境必须设置 maxmemory
3️⃣ 未设置淘汰策略
CONFIG SET maxmemory-policy allkeys-lru
4️⃣ 内存碎片率过高(> 1.5)
处理建议:
- 开启在线碎片整理:
CONFIG SET activedefrag yes
- 排查并治理大 Key
- 必要时在低峰期重启 Redis
七、最佳实践总结
- ✅ 生产环境必须设置
maxmemory - ✅ 合理选择内存淘汰策略(推荐
allkeys-lru) - ❌ 禁止使用
KEYS *排查大 Key - ✅ 使用
redis-cli --bigkeys定位风险 key - ✅ 关注
mem_fragmentation_ratio,而不是 allocator 指标 - ✅ 碎片率过高再开启
activedefrag