(一)写在前面:为什么需要“军规”
Redis 在测试环境跑得飞快,一到线上就“莫名其妙”抖动;大促前扩容 3 倍,成本却翻 5 倍;一次主从切换,缓存雪崩导致下游 DB 被打挂;开发说“Redis 是缓存,丢点数据无所谓”,结果用户下单重复扣款。
这些问题背后,是缺乏体系化的方法论。本文以“军规”形式,总结 40 条血泪经验,覆盖容量、性能、高可用、成本、监控、演练、治理七大主题。
(二)容量规划 6 条军规
军规 1:不要用“峰值 QPS × 平均 value 大小”估算内存。
真实公式:
memory = (key 总数 × (key 长度 + value 长度 + 56B 元数据)) × 1.3(碎片因子) + 复制 backlog + client 缓冲区 + AOF 重写缓冲区。
军规 2:提前 6 个月规划 TTL。
业务方往往拍脑袋写 86400s,结果 90% key 3 小时后就无访问。TTL 减半,内存立省一半,但需评估击穿风险。
军规 3:冷热分级。
把 30 天未访问的 key 迁移到 SSD Redis 或 OSS,接口延迟从 1 ms 涨到 5 ms,但内存成本降 70%。
军规 4:预分配集群槽位。
不要等 1000 个节点再扩容,提前按业务域分池,避免跨槽事务。
军规 5:预留 20% 内存给复制与 AOF。
主从全量同步时,子进程瞬时内存翻倍,云主机 OOM Killer 会无情降临。
军规 6:定期跑 redis-cli --bigkeys。
10 KB 的 value 用 hash 拆分,>1 MB 的直接打回业务方。
(三)性能调优 8 条军规
军规 7:slowlog 阈值不要设 10 ms,请设 1 ms。
一次 Lua 脚本 50 ms,会拖慢整个事件循环。
军规 8:避免 keys *、flushdb。
用 SCAN + pipeline,或者把命令改写成 Lua。
军规 9:监控 used_cpu_sys 与 used_cpu_user 比例。
比例 > 3 说明系统调用开销大,检查是否频繁 fork、swap。
军规 10:开启 io-threads 前,先用 redis-benchmark 压测。
单核 QPS 已 > 8 万且 value > 4 KB 时才生效。
军规 11:TLS 不是洪水猛兽。
在 AWS Nitro Enclaves 上,TLS 握手延迟 < 0.2 ms,CPU 消耗 < 5%,安全合规收益远高于性能损耗。
军规 12:关闭 THP。
Transparent Huge Page 会导致 30 ms 级延迟毛刺。
军规 13:NUMA 绑核。
在多 socket 服务器上,把 Redis 绑到同一个 NUMA node,避免跨 node 访存。
军规 14:避免 swap。
vm.overcommit_memory=1,关闭 swap,或把 swapiness 调到 1。
(四)高可用与故障演练 10 条军规
军规 15:哨兵至少 3 节点,且跨机架。
两节点“脑裂”时,业务永远选错主。
军规 16:cluster-require-full-coverage=no。
当 1/16384 槽位异常时,集群仍可服务。
军规 17:每月一次“机房断电”演练。
用 iptables 随机 drop 500 ms 包,模拟网络抖动;用 tc 注入 200 ms 延迟,验证客户端重试策略。
军规 18:故障演练前先跑 redis-check-aof 与 redis-check-rdb。
AOF 尾部写坏时,可用 redis-check-aof --fix 截断到最近合法命令。
军规 19:配置 client-output-buffer-limit replica 256mb 64mb 60。
防止 replica 读取慢导致 master 缓冲区堆积。
军规 20:设置 min-replicas-to-write 1。
极端情况下,拒绝写请求,保护数据。
军规 21:使用 redis-cli --rdb 做异地冷备。
RDB 流式传输,无需停机。
军规 22:Prometheus 采集间隔 5 s,不要 30 s。
故障窗口 30 s 足以让熔断失效。
军规 23:告警分级。
P0:master 宕机;P1:replica 延迟 > 1 s;P2:used_memory > 85%。
军规 24:灰度升级。
先在只读实例升级,跑 24 h 无异常再升级主库。
(五)成本治理 7 条军规
军规 25:开启内存压缩。
listpack + 32 位编码,可省 40% 内存。
军规 26:使用 Spot 实例跑 replica。
Spot 被回收时,自动提升其他 replica。
军规 27:购买云上预留实例,不要按量。
3 年期预留比按量便宜 60%。
军规 28:定期回收僵尸 key。
写脚本扫描 TTL=-1 且 idle > 7 天的 key,发工单给业务 owner。
军规 29:避免跨 AZ 流量费。
同地域多 AZ 部署,用 VPC Endpoint 走内网。
军规 30:把日志压缩后转存 OSS。
AOF 重写后 7 天自动打包 gzip,节省 90% 存储。
军规 31:按业务域拆分集群。
A 业务 20 G、B 业务 200 G,放一起会导致 A 被迫付 10 倍成本。
(六)监控与可观测性 5 条军规
军规 32:用 redis_exporter + Grafana,而不是自己写脚本。
社区已支持 200+ 指标,覆盖 99% 场景。
军规 33:关注 master_last_io_seconds_ago。
replica 延迟不是看 offset,而是看主从最后一次交互时间。
军规 34:记录 executed_commands_total。
突增 10 倍,可能是业务死循环或爬虫。
军规 35:用 keyspace_misses / (hits + misses) 计算命中率。
不要只看 info stats 的 keyspace_hits。
军规 36:开启 latency-monitor-threshold 100。
记录 > 100 μs 的操作栈,方便火焰图定位。
(七)客户端与业务协同 4 条军规
军规 37:禁止 keys、monitor、flushall 命令。
用 ACL 屏蔽,或重命名为随机字符串。
军规 38:连接池大小 = (峰值 QPS × 平均 RTT) / (1 - 连接利用率)。
不要拍脑袋设 200。
军规 39:重试策略必须带 jitter。
固定 1 s 重试会导致 thundering herd。
军规 40:重大活动前 2 周冻结 Redis 配置变更,并做压测。
变更窗口不跨 0 点,方便回滚。
(八)结语
Redis 的门槛不在安装,而在“如何不踩坑”。40 条军规不是教条,而是“踩坑—复盘—固化”的循环产物。愿你在下一次故障来临前,已把它们变成肌肉记忆。