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 的工具。

官方参考#

SLOWLOG · 延迟诊断 · ACL · UNLINK

学习导航#

上一课:Redis 进阶 07:复制、Sentinel 与 Cluster · 学习目录

Redis 进阶 08:排障、安全与毕业实战
作者:LcooYa
CC BY-NC-SA 4.0
相关文章
随机文章