Redis 进阶 08:排障、安全与毕业实战
实验基线:Redis 7.4.11,先完成环境准备。除标注为宿主机终端的代码外,Redis 命令在该课指定的 redis-cli 中执行;不复制输出结果作为命令。
学习目标#
建立从症状到证据的排障顺序,识别慢命令、大 Key 与热 Key,完成一次缓存业务的综合演练。
原理:延迟有多层来源#
应用等待包含连接池、网络、Redis 排队、命令执行和响应传输。SLOWLOG 主要记录命令执行耗时,不包含所有网络时间;应用慢而慢日志空,不代表应用测量错误。
大 Key 指成员数或体积很大,热 Key 指访问频率很高,它们是不同问题。拆大 Key 要结合访问方式,解决热 Key 可能需要请求合并、本地缓存或业务分片,但分片会改变一致性与聚合方式。
实验:观察而不制造危险负载#
在主实验 redis-learning 中执行:
PING
INFO clients
INFO memory
INFO stats
INFO commandstats
SLOWLOG LEN
SLOWLOG GET 5
CONFIG GET slowlog-log-slower-than
LATENCY LATEST
查看 connected_clients、blocked_clients、used_memory、evicted_keys、keyspace_hits/misses 和命令调用次数。SLOWLOG 可能为空,这是合法结果。LATENCY LATEST 在未启用监控或未触发事件时也可能为空。
不要为了构造慢日志在共享实例执行巨大 KEYS、MONITOR 或长循环 Lua。MONITOR 会产生负载并可能暴露命令参数,诊断时需严格控制访问和持续时间。
大 Key 与热 Key 的诊断路径#
宿主机执行渐进扫描:
docker exec redis-learning redis-cli --bigkeys
输出按数据类型报告大键候选,不是完整字节排行榜,也不是一致快照。扫描会给服务增加负载,大实例应控制节奏,先在低峰或副本评估。
找到候选后用 TYPE、MEMORY USAGE、HLEN、LLEN、SCARD、ZCARD、XLEN 查看合适的指标,不要不分类型执行 HGETALL。热键诊断需要访问频率数据;redis-cli --hotkeys 依赖 LFU 策略及访问统计,不能在 LRU 实例上直接得到可靠热点结论。
安全:最小权限与可达性#
实验环境已经把端口绑定到 127.0.0.1。生产还应配置网络访问控制、ACL 用户和按部署支持配置 TLS;密码不能硬编码在公开文章或提交到配置目录。
连接凭据使用受控密钥管理,不把真实密码写进终端历史、URL、日志。ACL 应限制业务能访问的键模式与命令,管理命令和备份操作使用独立身份。
可以先只读检查 ACL:
ACL WHOAMI
ACL GETUSER default
实验默认用户可能是 nopass 且允许全部命令,这不是生产配置范例。调整 ACL 前要有独立管理访问和恢复方式,本课不更改当前用户以免锁住实验实例。
综合练习:商品缓存排障#
需求:商品缓存 60 秒、统计访问数、10 分钟后清理统计。模拟“缓存已经不存在,但统计仍存在”的情况,并解释它是否一定是故障:
UNLINK learn:ops:product:42 learn:ops:views:42
SET learn:ops:product:42 '{"id":42,"priceCents":9900}' EX 60
EVAL "local n=redis.call('INCR',KEYS[1]); if n==1 then redis.call('EXPIRE',KEYS[1],600); end; return n" 1 learn:ops:views:42
DEL learn:ops:product:42
GET learn:ops:product:42
GET learn:ops:views:42
TTL learn:ops:views:42
预期 nil、1、正的 TTL。答案:不一定是故障,缓存和统计是独立生命周期;应先对照过期、删除、淘汰和写入错误证据,再决定是否重新回源。
追加排查题:Redis OOM 时,应优先查看 maxmemory、策略、内存增量和键增长;应用超时时,应查看连接池等待、网络、客户端超时设置与 Redis 慢日志。不要直接“重启看看”,否则可能丢失证据和未持久数据。
常见错误#
- 只看平均延迟:应关注 p95/p99 与峰值期间的错误率。
- 直接删除大对象造成主线程长时间停顿:评估 UNLINK 异步释放,但实际资源释放仍需成本。
- 隐藏 ACL、解析或网络错误并返回空对象:应用会错误判断为业务空数据。
- 用缓存实例承担唯一数据存储,却没有恢复演练与损失目标。
清理与毕业标准#
UNLINK learn:ops:product:42 learn:ops:views:42
完成系列后,回到第一课停止并删除 redis-learning。毕业验收:能为一个业务选择结构、定义 TTL、处理缓存断连、设计幂等与恢复,并用实际指标说明一项故障原因。把 Redis 当成可观测、会失败的系统,而不是只有 GET/SET 的工具。







