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 36003.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
done3.3 压缩 value
# JSON 太长?压缩后存储(应用层 gzip/snappy)
# 或者用 hash 的字段打包(zipmap 编码,小 hash 内存省一半)
redis-cli CONFIG GET hash-max-zipmap-entries
redis-cli CONFIG SET hash-max-zipmap-entries 1283.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 慢查询优化实战、内存泄漏排查实战。
延伸阅读
- 网站环境怎么选:LNMP 手动 / 宝塔面板 / Docker / 云开发
- 问卷表单系统搭建:SurveyKing / Formbricks,数据自己收
- 图床搭建:Lsky Pro / Lychee,自托管图片托管方案
- 邮件列表搭建:listmonk 自托管 Newsletter,把读者握在自己手里
- 文档站点搭建:MkDocs / VuePress / Docsify,产品文档与技术手册方案
- RSS 阅读器搭建:FreshRSS 自托管,把信息流拿回自己手里
- 短链接服务搭建:Shlink 自托管,链接数据自己掌握
- 网站状态监控页搭建:Uptime Kuma,服务器挂了第一时间知道

[...]netsh advfirewall firewall add rule name="GameRange" dir=in action=allow protocol=UDP localport=26901-26903完整的 Windows 环境准备(远程桌面连接、运行库安装、SteamCMD 用法、开机自启、8 个常见坑)见:《Windows 云服务器开服通用前置教程》→ htt[...]
2026-10-18 回复
[...]})Redis 必须设密码——没密码的 Redis 是公网扫描器的自助提权通道,见Redis 未授权访问防护。缓存雪崩防护(随机过期时间)见Redis 大 Key 与热 Key 处理。六、备份:数据的最后防线小程序后台的数据库是纯增量资产,丢了不可再生。三层备份:# 1. 每日逻辑备份(crontab)[...]
2026-10-18 回复