第31章:内存管理与优化
本章目标
掌握内存监控 + bigkey排查 + 热key处理 + 内存优化
31.1 内存监控
bash
# 内存使用情况
INFO memory
MEMORY STATS
# 查看指定Key的内存
MEMORY USAGE user:1
# 内存诊断(7.0+)
MEMORY DOCTOR
# 主动释放内存碎片(4.0+)
MEMORY PURGE关键指标
used_memory_human # 总使用内存
maxmemory_human # 最大内存限制
mem_fragmentation_ratio # 碎片率(>1.5 建议重启/ PURGE)
keyspace_hits / keyspace_misses # 命中率31.2 bigkey 排查
bigkey = 单个 Key 的数据太大(如 Hash 百万 field、List 百万元素)
bash
# 扫描 bigkey
redis-cli --bigkeys
# 输出:
# Biggest string found: "article:999" (1.2MB)
# Biggest hash found: "user:1:logs" (1000000 fields)
# Biggest list found: "queue:tasks" (500000 items)bigkey 危害
| 危害 | 说明 |
|---|---|
| 阻塞 | DEL 大 Key 时阻塞主线程 |
| 内存不均 | Cluster 中某节点内存爆满 |
| 网络拥塞 | 读取大 Key 占用大量带宽 |
| 过期阻塞 | 大 Key 过期删除时卡 |
解决方案
bash
# 1. 拆分大 Key(Hash 按日期拆分)
user:1:logs → user:1:logs:202401, user:1:logs:202402...
# 2. 异步删除
UNLINK big:key # 后台删
# 3. 配置 lazyfree-lazy-* 系列
lazyfree-lazy-expire yes # 过期异步删
lazyfree-lazy-server-del yes # 内部异步删31.3 热 key 处理
热 key = 被大量请求集中访问的 Key(如秒杀商品)
问题:热 key 所在的 Redis 节点被打爆
解决:
1. 客户端本地缓存(短期缓存热点数据)
2. 多副本热 key(在多个 Redis 节点存副本,随机读)
3. 读写分离(读走 Slave)31.4 内存优化技巧
| 技巧 | 效果 |
|---|---|
| 短 Key 名 | u:1:n 代替 user:1:name |
| 小 Hash 用 listpack | 默认压缩,省内存 |
| 过期时间合理 | 避免堆积无用数据 |
| maxmemory-policy 合理 | allkeys-lru 自动淘汰 |
| 关闭没用的功能 | 不需要持久化则关 RDB/AOF |
本章小结
MEMORY USAGE/--bigkeys/MEMORY DOCTOR排查- bigkey → 拆分 + UNLINK + lazyfree
- 热 key → 本地缓存 + 多副本
- 短 Key + 合适淘汰策略 → 省内存
练习题
- 用 MEMORY USAGE 查看不同类型 Key 的内存占用。
- 创建一个大 List,用 --bigkeys 扫描。
- 总结 bigkey 的三个危害和三个解决方案。