1099 字
5 分钟
Redis 生产调优实践

Redis 是单线程模型(6.x 起 IO 线程可选),调优思路与其他组件相反:不是加资源,而是控制单个操作的成本——大 Key、慢命令、全量复制是三大杀手。内存管理(淘汰策略、编码优化)与持久化取舍是日常重点。部署安装见《大数据与中间件组件部署总览》。

核心参数与调优理解#

参数默认值调优理解
maxmemory0(不限)内存上限,生产必须设,否则 OOM 被内核杀掉
maxmemory-policynoeviction淘汰策略:allkeys-lru(缓存通用)、volatile-lru(只淘汰带 TTL 的键)
appendonlynoAOF 持久化,生产开启;appendfsync 选 everysec 平衡
appendfsynceverysec每秒刷盘:最常用;always 最安全最慢;no 交给 OS
save默认 RDB 策略RDB 快照条件,与 AOF 配合使用
maxclients10000最大客户端连接,连接池满报错时查这个
io-threads4(6.x 起)IO 线程数(仅网络读写),CPU 核多时可设 8;命令执行仍单线程
hash-max-listpack-entries128小对象编码阈值:小 hash/list 用紧凑编码,省内存但操作快
timeout0空闲连接超时,建议 300 秒防连接堆积
rename-command禁危险命令:FLUSHALL、FLUSHDB、KEYS 重命名/禁用
NOTE

大 Key 是 Redis 的头号事故源:单个 string > 10MB 或集合元素 > 万级,会造成阻塞(删除、迁移、复制全卡)。治理手段:拆 Key(按业务维度分片)、UNLINK 异步删除(4.0+)、SCAN 替代 KEYS

三档规格推荐参数#

参数8C16G32C256G64C512G
maxmemory10G24G40G
maxmemory-policyallkeys-lruallkeys-lruallkeys-lru
appendonlyyesyesyes
appendfsynceveryseceveryseceverysec
io-threads488
maxclients100003000050000
timeout300300300
hash-max-listpack-entries128128128
实例规划单实例多实例分片(2~4 个)多实例分片(4~8 个)
WARNING

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
NOTE

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 定位业务侧泄漏

调优检查清单#

  1. maxmemory + 淘汰策略必设
  2. 大 Key/慢命令红线管控,SLOWLOG 巡检
  3. AOF everysec + RDB 兜底,备份定期演练
  4. 大机器拆多实例或 Cluster,缩小爆炸半径
  5. 连接池与 maxclients 匹配
  6. 主从/Sentinel/Cluster 故障转移演练
Redis 生产调优实践
https://chaggle.github.io/posts/2026/08/10/redis-tuning/
作者
chaggle
发布于
2026-08-09
许可协议
CC BY-NC-SA 4.0