Skip to content

第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 + 合适淘汰策略 → 省内存

练习题 ​

  1. 用 MEMORY USAGE 查看不同类型 Key 的内存占用。
  2. 创建一个大 List,用 --bigkeys 扫描。
  3. 总结 bigkey 的三个危害和三个解决方案。

把零散知识,整理成可以反复走的路。