Ubuntu上Redis性能调优实战指南
一 系统层优化
- 提升连接处理能力:调高内核网络参数,编辑 /etc/sysctl.conf,增加或调整为:
- net.core.somaxconn=65535
- net.ipv4.tcp_max_syn_backlog=4096
- 应用后执行:sudo sysctl -p
- 文件描述符上限:编辑 /etc/security/limits.conf,为运行 Redis 的用户(如 redis)增加:
- redis soft nofile 65535
- redis hard nofile 65535
- 存储与内存:优先使用 SSD/NVMe;确保系统内存充足,避免 swap 抖动;NUMA 架构下绑定实例到单一 NUMA 节点以减少跨节点访问开销(如 numactl --cpunodebind=0 --membind=0)。
- 资源隔离:为 Redis 配置 cgroups/CPU 亲和 与 内存隔离,避免被其他进程抢占。
二 Redis配置优化
- 内存与淘汰策略:设置合理上限与策略(示例为 /etc/redis/redis.conf)
- maxmemory 4gb
- maxmemory-policy allkeys-lru(缓存场景);若需尽量不丢数据,可选 volatile-lru 并配合过期时间
- 数据结构内存紧凑:启用 ziplist/intset 等紧凑编码阈值(按需微调)
- hash-max-ziplist-entries 512
- hash-max-ziplist-value 64
- list-max-ziplist-size -2
- set-max-intset-entries 512
- zset-max-ziplist-entries 128
- zset-max-ziplist-value 64
- 持久化取舍与频率:
- 仅缓存且可丢:可关闭持久化(save “” 且 appendonly no)
- 兼顾性能与安全:RDB 快照适度(如 save 900 1 等),AOF 使用 appendfsync everysec
- 网络与连接:
- tcp-keepalive 300
- timeout 300
- 高并发建议启用 TCP_NODELAY(减少 Nagle 延迟)
- 提升 backlog(如 tcp-backlog 511),与内核 somaxconn 匹配
- 客户端与命令:
- 客户端使用连接池复用连接
- 读写尽量使用 Pipeline/MGET/MSET 批量操作
- 删除大 key 使用 UNLINK 替代 DEL,避免阻塞主线程
- 多核利用:单机多实例按 CPU 核心 拆分,每个实例绑定不同端口与 CPU 亲和,避免锁竞争
示例配置片段(按需合并到 redis.conf):
maxmemory 4gb
maxmemory-policy allkeys-lru
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
save 900 1
appendonly yes
appendfsync everysec
tcp-keepalive 300
timeout 300
tcp-backlog 511
应用配置:sudo systemctl restart redis-server;验证:redis-cli ping。
三 客户端与访问模式
- 连接池:固定最小/最大连接数,启用连接复用与健康检查,避免频繁建连/断连
- 批量与管道:将多次小请求合并为 Pipeline 批量提交,减少 RTT 与系统调用
- 避免大 Key 与热 Key:拆分 大 key、对 热 key 做本地缓存或分片,降低单键操作压力
- 命令优化:减少高成本命令(如 SORT/ZUNIONSTORE 等)在 Redis 内执行,尽量在客户端完成计算或预处理
- TLS 与访问控制:跨机房/公网建议启用 TLS;配合 requirepass、bind、protected-mode 与 ufw 限制来源 IP
四 监控与持续优化
- 内置与命令行:
- 实时统计:redis-cli --stat
- 慢查询:SLOWLOG GET(结合业务设置 slowlog-log-slower-than)
- 运行时指标:INFO(关注 used_memory、evicted_keys、instantaneous_ops_per_sec、rejected_connections 等)
- 可视化与告警:使用 Prometheus + Grafana 采集 Redis Exporter 指标,配置内存、命中率、延迟、拒绝连接等告警
- 例行巡检:定期审计 大 key/热 key、慢查询、持久化耗时与 AOF 重写频率,结合压测验证参数变更效果
五 安全与常见陷阱
- 安全基线:设置 强密码(requirepass)、仅开放必要来源 IP(ufw/安全组)、必要时启用 TLS;禁用危险命令(如 FLUSHALL/FLUSHDB 可改名或限制)
- 持久化与恢复:RDB/AOF 配置不当易导致数据丢失或重写抖动,建议定期备份、监控 AOF 重写与 RDB 快照耗时
- 连接风暴:未设 timeout 或未用连接池,易出现 rejected_connections 与 TIME_WAIT 堆积,需结合连接池与内核参数治理
- 变更流程:任何参数调整先在测试环境验证,灰度发布,观察 used_memory/evicted_keys/ops 等指标再全量上线