Redis 生产实战 7×24:容量规划、性能调优、故障演练与成本治理 40 条军规

(一)写在前面:为什么需要"军规"

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 条军规不是教条,而是"踩坑---复盘---固化"的循环产物。愿你在下一次故障来临前,已把它们变成肌肉记忆。

相关推荐
·云扬·5 分钟前
MySQL 8.0 Redo Log 归档与禁用实战指南
android·数据库·mysql
IT邦德8 分钟前
Oracle 26ai DataGuard 搭建(RAC到单机)
数据库·oracle
惊讶的猫34 分钟前
redis分片集群
数据库·redis·缓存·分片集群·海量数据存储·高并发写
不爱缺氧i43 分钟前
完全卸载MariaDB
数据库·mariadb
期待のcode1 小时前
Redis的主从复制与集群
运维·服务器·redis
纤纡.1 小时前
Linux中SQL 从基础到进阶:五大分类详解与表结构操作(ALTER/DROP)全攻略
linux·数据库·sql
jiunian_cn1 小时前
【Redis】渐进式遍历
数据库·redis·缓存
橙露1 小时前
Spring Boot 核心原理:自动配置机制与自定义 Starter 开发
java·数据库·spring boot
冰暮流星1 小时前
sql语言之分组语句group by
java·数据库·sql
符哥20081 小时前
Ubuntu 常用指令集大全(附实操实例)
数据库·ubuntu·postgresql