Redis 性能调优是一个系统工程,涉及多个层面。以下是全面的调优指南,分为关键方向、具体措施和实战建议:
🔧 核心配置优化
1. 内存优化
bash
# 配置建议
maxmemory 16gb # 根据物理内存的70-80%设置
maxmemory-policy allkeys-lru # 根据业务选择策略
# volatile-lru / allkeys-lfu / volatile-ttl
策略选择:
-
缓存场景:
allkeys-lru或volatile-lru -
混合使用:
allkeys-lfu(访问频率模式) -
有TTL需求:
volatile-ttl
2. 持久化调优
bash
# RDB优化
save 900 1 # 根据业务容忍度调整
save 300 10
save 60 10000
rdbcompression yes
rdbchecksum yes
# AOF优化
appendfsync everysec # 平衡选择
# appendfsync always # 最强持久化,性能低
# appendfsync no # 交由系统,风险高
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-rewrite-incremental-fsync yes
⚡ 高性能关键配置
3. 网络与连接
bash
# 连接数优化
maxclients 10000
tcp-keepalive 300
timeout 0 # 生产环境建议设置超时
# 网络缓冲区
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
4. 内核参数调优(Linux)
bash
# 系统层面
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo 1 > /proc/sys/vm/overcommit_memory
sysctl -w net.core.somaxconn=65535
sysctl -w vm.swappiness=1
🎯 数据结构与使用优化
5. 数据结构选择
bash
# 字符串 vs Hash
# 小对象使用Hash存储更节省内存
HMSET user:1000 name "John" age 30
# 列表 vs Stream
# 消息队列优先使用Stream
XADD mystream * field1 value1
# 集合运算
# 大数据集考虑使用SCAN替代SMEMBERS
6. Pipeline批量操作
python
# Python示例
pipe = redis_client.pipeline()
for i in range(1000):
pipe.set(f'key:{i}', f'value:{i}')
pipe.execute() # 单次网络往返
7. Lua脚本优化
Lua
-- 减少网络往返,保证原子性
local key = KEYS[1]
local limit = tonumber(ARGV[1])
local current = redis.call('GET', key)
if current and tonumber(current) > limit then
return 0
end
redis.call('INCR', key)
return 1
📊 监控与诊断
8. 关键指标监控
bash
# 使用redis-cli监控
redis-cli --stat # 实时统计
redis-cli --bigkeys # 大key分析
redis-cli --memkeys # 内存分析
redis-cli --latency-history # 延迟监控
# INFO命令关键部分
redis-cli info memory
redis-cli info stats
redis-cli info commandstats
9. 慢查询分析
bash
# 配置慢日志
config set slowlog-log-slower-than 10000 # 10ms
config set slowlog-max-len 1000
# 查看慢查询
slowlog get 10
🚀 高级优化技巧
10. 集群优化
bash
# 数据分片
# 使用Cluster模式,避免热点Key集中
# 设置合理的slot分布
# 读写分离
# 从节点处理读请求
# 配置:replica-read-only yes
11. 客户端优化
java
// 连接池配置示例(Java)
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(200); // 最大连接数
config.setMaxIdle(50); // 最大空闲
config.setMinIdle(10); // 最小空闲
config.setMaxWaitMillis(1000); // 等待超时
config.setTestOnBorrow(true); // 借用测试
🎪 实战调优清单
快速排错流程:
-
检查延迟 :
redis-cli --latency -
内存分析 :
info memory+memory doctor -
大Key扫描 :
redis-cli --bigkeys -
热点Key :
redis-cli --hotkeys或监控commandstats -
连接数 :
info clients+client list
常见问题解决:
-
高延迟:检查持久化、大Key、内存交换
-
内存不足:优化数据结构、启用压缩、增加内存
-
连接泄露:检查客户端连接池配置
-
CPU过高:检查慢查询、优化Lua脚本
🔍 工具推荐
-
redis-benchmark - 基准测试
-
redis-rdb-tools - RDB分析
-
redis-stat - 实时监控
-
RedisInsight - 图形化管理
⚠️ 注意事项
-
生产环境先测试后变更
-
监控先行,优化在后
-
根据业务特性调整参数
-
定期进行容量规划
性能调优是持续性的工作,需要结合具体业务场景、数据特征和硬件资源进行针对性优化。建议建立完整的监控体系,在数据驱动下进行调优决策。