CentOS 上提升 Redis 性能的系统化做法
一 系统层优化
- 文件描述符与内核队列
- 提升进程可打开文件数与连接队列,避免“连接排队/拒绝”。在 /etc/security/limits.conf 增加:redis soft nofile 65535、redis hard nofile 65535;在 /etc/sysctl.conf 设置:net.core.somaxconn=1024、net.ipv4.tcp_max_syn_backlog=1024、net.ipv4.ip_local_port_range=1024 65535,执行 sysctl -p 生效。Redis 配置 tcp-backlog 511 与之匹配。
- 内存分配策略
- 为避免 BGSAVE/BGREWRITEAOF 的 fork() 在低内存场景失败,设置 vm.overcommit_memory=1(允许适度超售)。
- 透明大页(THP)
- THP 可能导致延迟抖动,建议关闭:echo never > /sys/kernel/mm/transparent_hugepage/enabled(建议写入 /etc/rc.local 或 systemd 服务以持久化)。
- 磁盘与 I/O
- 持久化尽量使用 SSD;AOF 刷盘策略在性能与持久性间权衡(见下文)。
- 资源与拓扑
- 优先充足内存与多核 CPU;数据量大或并发高时采用 Redis 集群 分片与读写分离。
二 Redis 配置优化
- 内存与淘汰
- 设置合理 maxmemory(如物理内存的约 70%~80%,预留 20%~30% 给系统与其他进程),根据业务选择淘汰策略:allkeys-lru / volatile-lru / allkeys-lfu 等。
- 持久化策略
- RDB:按需设置 save 策略(如 save 900 1、save 300 10、save 60 10000),在性能优先场景可降低频率或关闭。
- AOF:开启 appendonly yes;刷盘策略可选 appendfsync everysec(通用平衡)、no(性能最佳,风险最高)、always(最安全,性能最低)。
- 网络与连接
- 绑定监听地址 bind 127.0.0.1(仅本机)或内网地址;端口 port 6379;开启 tcp-backlog 511;客户端使用连接池复用连接,避免频繁建连/断连。
- 慢查询与命令使用
- 配置 slowlog-log-slower-than 10000(单位微秒)、slowlog-max-len 128,定期分析慢日志定位瓶颈;遍历键空间用 SCAN 替代 KEYS(避免阻塞)。
- 数据结构与对象
- 设计上避免大 key/大 value,必要时进行分片/压缩;选择合适的数据结构(如 Hash 存储对象字段),减少序列化开销与网络往返。
三 客户端与访问模式优化
- 批处理与减少 RTT
- 多命令场景使用 Pipeline 合并往返;高并发写入尽量批量提交,降低网络与内核态切换成本。
- 连接治理
- 合理设置连接池大小与超时;避免每条请求新建连接;对长连接进行心跳保活与空闲回收。
- 访问热点与倾斜
- 识别并打散热点 key(如加随机后缀、本地缓存),避免单分片/单实例成为瓶颈;读写分离与就近访问降低时延。
- 计算下沉
- 避免在 Redis 内做复杂计算/大对象聚合,将计算迁移至客户端或服务端侧的其他计算节点。
四 监控 压测 与安全
- 监控与告警
- 使用 INFO 与 slowlog 做日常巡检;结合 Prometheus + Grafana 搭建可视化监控,关注 instantaneous_ops_per_sec、used_memory、used_memory_rss、evicted_keys、blocked_clients、aof_delayed_fsync 等关键指标。
- 压测与容量规划
- 以真实流量模型进行压测(如 redis-benchmark 或业务脚本),验证 maxmemory、淘汰策略、持久化策略、连接池 等配置下的延迟与吞吐,并留出峰值余量。
- 安全加固(避免被滥用导致性能受损)
- 仅在内网开放访问,设置 requirepass 强密码;限制来源 IP;避免使用危险的命令(如在生产禁用 FLUSHALL/FLUSHDB),或通过 rename-command 隐藏;保持 Redis 版本为稳定版并及时更新。
五 快速检查清单与示例配置
- 快速检查清单
- limits 与 sysctl 已调优(nofile 65535、somaxconn 1024、tcp_max_syn_backlog 1024);THP=never;持久化策略与业务 RPO/RTO 对齐;慢查询阈值 10000 微秒;无 **KEYS ** 扫描;连接池已启用且合理;监控与告警到位。
- 示例关键配置(/etc/redis/redis.conf 片段)
- 绑定与端口:bind 127.0.0.1、port 6379
- 后台与日志:daemonize yes
- 内存与淘汰:maxmemory 4gb、maxmemory-policy allkeys-lru
- RDB:save 900 1、save 300 10、save 60 10000
- AOF:appendonly yes、appendfsync everysec
- 网络与连接:tcp-backlog 511
- 安全:requirepass your_password
- 慢查询:slowlog-log-slower-than 10000、slowlog-max-len 128
- 应用变更后执行:sudo systemctl restart redis 并观察日志与监控指标。