Redis 生产调优实践
Redis 是单线程模型(6.x 起 IO 线程可选),调优思路与其他组件相反:不是加资源,而是控制单个操作的成本——大 Key、慢命令、全量复制是三大杀手。内存管理(淘汰策略、编码优化)与持久化取舍是日常重点。部署安装见《大数据与中间件组件部署总览》。
核心参数与调优理解
| 参数 | 默认值 | 调优理解 |
|---|---|---|
maxmemory |
0(不限) | 内存上限,生产必须设,否则 OOM 被内核杀掉 |
maxmemory-policy |
noeviction | 淘汰策略:allkeys-lru(缓存通用)、volatile-lru(只淘汰带 TTL 的键) |
appendonly |
no | AOF 持久化,生产开启;appendfsync 选 everysec 平衡 |
appendfsync |
everysec | 每秒刷盘:最常用;always 最安全最慢;no 交给 OS |
save |
默认 RDB 策略 | RDB 快照条件,与 AOF 配合使用 |
maxclients |
10000 | 最大客户端连接,连接池满报错时查这个 |
io-threads |
4(6.x 起) | IO 线程数(仅网络读写),CPU 核多时可设 8;命令执行仍单线程 |
hash-max-listpack-entries |
128 | 小对象编码阈值:小 hash/list 用紧凑编码,省内存但操作快 |
timeout |
0 | 空闲连接超时,建议 300 秒防连接堆积 |
rename-command |
无 | 禁危险命令:FLUSHALL、FLUSHDB、KEYS 重命名/禁用 |
大 Key 是 Redis 的头号事故源:单个 string > 10MB 或集合元素 > 万级,会造成阻塞(删除、迁移、复制全卡)。治理手段:拆 Key(按业务维度分片)、UNLINK 异步删除(4.0+)、SCAN 替代 KEYS。
三档规格推荐参数
| 参数 | 8C16G | 32C256G | 64C512G |
|---|---|---|---|
maxmemory |
10G | 24G | 40G |
maxmemory-policy |
allkeys-lru | allkeys-lru | allkeys-lru |
appendonly |
yes | yes | yes |
appendfsync |
everysec | everysec | everysec |
io-threads |
4 | 8 | 8 |
maxclients |
10000 | 30000 | 50000 |
timeout |
300 | 300 | 300 |
hash-max-listpack-entries |
128 | 128 | 128 |
| 实例规划 | 单实例 | 多实例分片(2~4 个) | 多实例分片(4~8 个) |
64C512G 的机器不要跑一个 40G 的 Redis:单实例故障影响面=整机、AOF 重写时 IO 阻塞全实例。生产按业务拆多实例(缓存/会话/排行榜各一个实例),或直接上 Redis Cluster,把单实例的爆炸半径缩小。
集群规模优化(几十~上百节点)
- Redis Cluster 规划:16384 个槽按节点均分;3 主 3 从起步,扩容加主节点自动迁移槽;客户端路由(lettuce/jedis cluster 模式)
- 哨兵 vs 集群:数据量 < 50G 用”主从 + Sentinel(3 台)”即可;数据量大、需水平扩展用 Cluster
- 读写分离:Cluster 内从节点可读(
readonly),读多场景配读路由;注意从节点读到的数据可能滞后 - 内存编码利用:小对象走紧凑编码(listpack/intset),大批小 value 场景内存省 50%+;
MEMORY USAGE key验证 - 过期键清理:
activedefrag(碎片整理,6.x)+ 过期键惰性/定期删除机制,maxmemory-policy兜底 - 连接与慢命令治理:
SLOWLOG GET定期查慢命令,大 Key/KEYS/HGETALL大集合列为红线 - 故障转移演练:Cluster 自动 failover 与手动
CLUSTER FAILOVER演练纳入运维计划
容灾与备份
| 层级 | 手段 | 说明 |
|---|---|---|
| 高可用 | 主从 + Sentinel / Cluster | 自动故障转移,秒级切换 |
| 数据 | RDB/AOF 定期备份 | BGSAVE 生成 RDB,或直接用持久化文件快照(停写瞬间拷贝) |
| 异地 | 跨机房从节点 | 灾备机房挂从节点(或 Cluster 跨机房),切换读流量 |
| 变更 | 内存/Key 审计 | 定期扫描大 Key 与内存分布(redis-rdb-tools/MEMORY STATS) |
Redis 备份的误区:把它当唯一数据源。Redis 是缓存与高速通道,持久化能力是保底不是主用——设计上保证”Redis 全丢,业务能重建”(DB 恢复/消息重放),备份只是降低重建成本。生产惯例:缓存场景容忍 AOF 每秒刷盘;数据可重建的业务,Redis 挂了直接重建,不做”数据库式”的严格备份。
调优常见问题
- **
OOM command not allowed when used memory > 'maxmemory'**:达到 maxmemory 且淘汰策略不匹配(如 noeviction);按业务调策略或扩内存 - 单线程阻塞、延迟毛刺:大 Key 删除/迁移、
KEYS、AOF 重写、RDB fork;用LATENCY监控定位,逐个治理 - 主从复制卡住:全量复制时
repl-backlog-size太小导致断线重连触发反复全量;调大 backlog(如 128M) - 内存碎片率高:
MEMORY FRAGMENTATION高于 1.5,开启activedefrag yes(7.x 默认)或定期重启实例 - 连接数打满:客户端连接池未回收(
maxclients报错),查CLIENT LIST定位业务侧泄漏
调优检查清单
- maxmemory + 淘汰策略必设
- 大 Key/慢命令红线管控,SLOWLOG 巡检
- AOF everysec + RDB 兜底,备份定期演练
- 大机器拆多实例或 Cluster,缩小爆炸半径
- 连接池与 maxclients 匹配
- 主从/Sentinel/Cluster 故障转移演练
Redis 生产调优实践
https://chaggle.github.io/2026/08/09/middleware/redis-tuning-20260810/