15 10 月 2026

Redis 用着用着变慢:DEL 一个 key 卡住整个实例、某个操作延迟突然飙升、主从同步 lag 越来越大——元凶常是大 Key 和热 Key。这篇讲怎么发现、怎么处理、怎么预防,命令全部可抄。

需要现成的游戏云服务器,可以看看财富云计算:一键开服面板,NAT 型无独立公网 IP,价格比独立 IP 机型省一半以上,建站和游戏服都能快速部署。

一、先定义:多大算大、多热算热

类型定义典型场景
大 Key单个 key 的 value > 10KB,或集合元素 > 5000用户会话全量、排行榜全量、大 hash 表
热 Key单个 key 的 QPS 占实例总 QPS 的 10%+首页配置、爆款商品库存、热门榜单

危害:

问题大 Key 造成热 Key 造成
延迟毛刺DEL/过期删除阻塞主线程单分片 CPU 打满
主从同步大 value 全量同步,lag 飙高流量倾斜,单节点压力
内存不均集群某些节点内存爆——
淘汰误伤大 key 难淘汰——

二、发现大 Key

# 方法一:redis-cli --bigkeys 采样扫描(生产安全,只读)
redis-cli --bigkeys

# 输出示例:
# --- Sampled 10000 keys
# Biggest string found: 'user:profile:8888' (524288 bytes)
# Biggest hash found: 'session:pool' with 50000 fields
# 方法二:精确看某个 key 的大小
redis-cli MEMORY USAGE user:profile:8888
redis-cli STRLEN user:profile:8888
redis-cli HLEN session:pool          # hash 字段数
redis-cli ZCARD leaderboard:global   # zset 元素数
redis-cli LLEN queue:pending         # list 长度
# 方法三:SCAN 全量扫(库不大时用,生产用 --bigkeys 采样即可)
redis-cli --scan --pattern 'user:*' | head -1000 | while read k; do
  echo "$(redis-cli MEMORY USAGE $k) $k"
done | sort -rn | head -20

阈值参考:string > 10KB、hash/zset/set/list 元素 > 5000,就该处理了。

三、处理大 Key

3.1 拆分成小 key

# 差:一个 hash 存 5 万个字段
HSET session:pool user1:xxx user2:xxx ... (5万行)

# 好:按用户 ID 分片,每个 hash 几百字段
HSET session:pool:1001 user1:xxx
HSET session:pool:1002 user2:xxx
# 或直接每用户一个 key:
SET session:user:8888 '{"cart":...}' EX 3600

3.2 大集合分批操作(删除是重点)

直接 DEL 大 key 会阻塞 Redis 数秒——线上事故之源。用 UNLINK(异步删除):

# 安全删除大 key
redis-cli UNLINK session:pool

# 集合类型分批删(hscan/zscan 每次取一批)
redis-cli --scan --pattern 'bigkey:*' | while read k; do
  # hash 分批
  while true; do
    fields=$(redis-cli HSCAN $k 0 COUNT 100 | ...)
    [ -z "$fields" ] && break
    redis-cli HDEL $k $fields
  done
done

3.3 压缩 value

# JSON 太长?压缩后存储(应用层 gzip/snappy)
# 或者用 hash 的字段打包(zipmap 编码,小 hash 内存省一半)
redis-cli CONFIG GET hash-max-zipmap-entries
redis-cli CONFIG SET hash-max-zipmap-entries 128

3.4 设置过期与监控

# 业务 key 必须带 TTL,不然只涨不消
SET session:user:8888 '...' EX 7200

# 监控大 key(定期跑 --bigkeys 存结果)
redis-cli --bigkeys > /tmp/bigkeys-$(date +%F).log

四、发现热 Key

Redis 自身不直接报告热 key,用这些手段:

# 方法一:monitor(实时看请求流,生产只开几秒!)
redis-cli monitor | head -1000
# 统计:
redis-cli monitor | head -10000 | awk '{print $2}' | sort | uniq -c | sort -rn | head

# 方法二:redis-hot-key 工具(读 rdb 或采样)
# GitHub: redis-hot-key 等开源方案

# 方法三:客户端埋点(最准,统计每个 key 的调用次数)

判读:monitor 采样 1 万条命令,某个 key 出现超过 500 次 = 热 key。

五、处理热 Key

5.1 本地缓存(最有效)

热点配置、首页数据——应用层加个 1~5 秒的本地缓存(Caffeine/Guava),Redis 请求量掉 90%。适合「允许短暂不一致」的数据。

5.2 热 key 复制多份

# 把热 key 复制成 key_1 ~ key_9,随机读一份,流量摊到多个 slot/节点
SET hot:config:1 '{...}'
SET hot:config:2 '{...}'
...
# 客户端:hot:config:$((RANDOM % 9 + 1))

集群模式下,这些 key 分散到不同分片,单节点压力骤降。

5.3 读写分离/加从节点

读多写少的热数据,客户端读从节点,主节点只扛写。主从搭建见Redis 哨兵与集群模式。

5.4 业务层改造

  • 库存扣减:Redis 扣 + 异步落库,别直捶数据库
  • 排行榜:只缓存 Top 100,全量在库里
  • 配置类:改造成「版本号 + 本地缓存」

六、预防规范

# 上线前检查清单:
# [ ] 单个 value < 10KB
# [ ] 集合元素 < 5000(超了分片)
# [ ] 所有业务 key 有 TTL
# [ ] 删除大 key 用 UNLINK
# [ ] 预估 QPS,单 key 不超总 QPS 10%

Redis 运维全景见Redis 安装与缓存应用实战,持久化配置见Redis 持久化 RDB 与 AOF,安全加固见Redis 未授权访问防护。

七、延迟毛刺自检流程

Redis 突然变慢
  ├─ SLOWLOG GET 10          → 看慢命令,大 key 操作会现形
  ├─ --bigkeys               → 找大 key
  ├─ monitor 采样            → 找热 key
  ├─ INFO stats              → keyspace_hits/misses,命中率暴跌?
  ├─ INFO memory             → used_memory 逼近 maxmemory?触发淘汰了
  └─ dmesg                   → Swap 在动?内存不够换页也会慢
# 慢命令日志
redis-cli SLOWLOG GET 10
redis-cli CONFIG SET slowlog-log-slower-than 10000   # 10ms 记一笔

# 内存与淘汰状态
redis-cli INFO memory | grep -E "used_memory_human|maxmemory"
redis-cli INFO stats | grep evicted

大 Key 和热 Key 是 Redis 从「能跑」到「跑得好」的分水岭。记住三个动作:--bigkeys 每周跑一次、UNLINK 代替 DEL、热数据加本地缓存。Redis 就能又稳又快。

需要现成的游戏云服务器,可以看看财富云计算:一键开服面板,NAT 型无独立公网 IP,价格比独立 IP 机型省一半以上,建站快速部署。延伸阅读:Redis 哨兵与集群模式、MySQL 慢查询优化实战、内存泄漏排查实战。

延伸阅读
  1. 网站环境怎么选:LNMP 手动 / 宝塔面板 / Docker / 云开发
  2. 问卷表单系统搭建:SurveyKing / Formbricks,数据自己收
  3. 图床搭建:Lsky Pro / Lychee,自托管图片托管方案
  4. 邮件列表搭建:listmonk 自托管 Newsletter,把读者握在自己手里
  5. 文档站点搭建:MkDocs / VuePress / Docsify,产品文档与技术手册方案
  6. RSS 阅读器搭建:FreshRSS 自托管,把信息流拿回自己手里
  7. 短链接服务搭建:Shlink 自托管,链接数据自己掌握
  8. 网站状态监控页搭建:Uptime Kuma,服务器挂了第一时间知道
更多阅读
  1. 上一篇:MySQL 慢查询优化实战:慢日志、EXPLAIN、索引三板斧
  2. 下一篇:Docker 数据卷与网络详解:数据不丢、容器互通的完整指南
发表评论 2

取消回复