Redis 性能调优实战
性能调优是 Redis 运维的核心工作。通过合理的配置优化、内存管理、网络调优,可以显著提升 Redis 的性能和稳定性。本文将分享 Redis 性能调优的实战经验。
一、性能基准测试
1.1 redis-benchmark 工具
# 基本测试
redis-benchmark -h 127.0.0.1 -p 6379 -q
# 输出示例
PING_INLINE: 100000.00 requests per second
PING_BULK: 100000.00 requests per second
SET: 100000.00 requests per second
GET: 100000.00 requests per second
1.2 详细测试
# 指定命令测试
redis-benchmark -t SET,GET -n 100000 -q
# 带数据大小测试
redis-benchmark -t SET,GET -d 1024 -n 100000 -q
# 并发连接测试
redis-benchmark -c 100 -t SET,GET -n 100000 -q
# Pipeline 测试
redis-benchmark -P 10 -t SET,GET -n 100000 -q
1.3 测试结果分析
# 测试参数说明
-n 100000 # 总请求数
-c 50 # 并发连接数
-d 1024 # 数据大小(字节)
-P 10 # Pipeline 大小
-q # 安静模式(只显示结果)
# 关键指标
requests per second # 每秒请求数(QPS)
latency # 延迟
二、内存优化
2.1 数据结构优化
# 1. 使用 Hash 替代 String
# ❌ 不推荐
SET user:1001:name "John"
SET user:1001:age 25
SET user:1001:email "john@example.com"
# 内存:3 个独立对象
# ✅ 推荐
HSET user:1001 name "John" age 25 email "john@example.com"
# 内存:1 个 Hash 对象(更紧凑)
2.2 编码优化
# 查看编码
OBJECT ENCODING key
# 输出示例
embstr # 小字符串(< 44 字节)
raw # 大字符串
int # 整数
ziplist # 压缩列表(小 Hash/List/ZSet)
hashtable # 哈希表(大 Hash)
skiplist # 跳表(大 ZSet)
优化配置:
# 触发 ziplist 编码
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
2.3 内存淘汰策略
# 配置内存淘汰策略
maxmemory 4gb
maxmemory-policy allkeys-lru
# 可选策略
# noeviction: 不淘汰(返回错误)
# allkeys-lru: 淘汰最近最少使用的键(推荐)
# volatile-lru: 淘汰最近最少使用的有过期时间的键
# allkeys-random: 随机淘汰
# volatile-random: 随机淘汰有过期时间的键
# volatile-ttl: 淘汰剩余时间最短的键
2.4 内存碎片整理
# 主动碎片整理
activedefrag yes
active-defrag-ignore-bytes 100mb
active-defrag-threshold-lower 10
active-defrag-threshold-upper 100
active-defrag-cycle-min 1
active-defrag-cycle-max 25
手动整理:
# 重启 Redis(最彻底)
redis-cli SHUTDOWN
redis-server
# 触发碎片整理
redis-cli CONFIG SET activedefrag yes
三、网络优化
3.1 TCP 配置
# TCP 连接配置
tcp-backlog 511
tcp-keepalive 300
timeout 0
# 高性能配置
tcp-backlog 65535 # 增加连接队列
tcp-keepalive 60 # 更频繁的 keepalive
timeout 300 # 客户端超时
3.2 绑定地址
# 绑定特定地址(更安全)
bind 192.168.1.1
# 绑定所有地址(不推荐生产)
bind 0.0.0.0
# 禁用保护模式(内网环境)
protected-mode no
3.3 禁用危险功能
# 禁用危险命令
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG ""
rename-command DEBUG ""
# 禁用持久化(纯缓存场景)
save ""
appendonly no
四、持久化优化
4.1 RDB 优化
# RDB 配置
save 900 1
save 300 10
save 60 10000
dbfilename dump.rdb
dir /var/lib/redis
rdbcompression yes
rdbchecksum yes
# 停止保存(高性能场景)
save ""
stop-writes-on-bgsave-error no
4.2 AOF 优化
# AOF 配置
appendonly yes
appendfilename "appendonly.aof"
# 同步策略
appendfsync everysec # 推荐(平衡)
# appendfsync always # 最安全,性能最低
# appendfsync no # 性能最高,最不安全
# 重写配置
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
# 重写时不刷盘
no-appendfsync-on-rewrite yes
# 混合持久化(Redis 4.0+)
aof-use-rdb-preamble yes
4.3 禁用持久化
# 纯缓存场景(最高性能)
save ""
appendonly no
# 注意:重启后数据丢失
# 仅适用于可丢失的缓存数据
五、并发优化
5.1 单线程优化
# Redis 6.0+ 多线程 I/O
io-threads 4 # I/O 线程数(推荐 CPU 核心数/2)
io-threads-do-reads yes # 是否多线程处理读命令
注意:
- 写命令仍然单线程
- 线程数不要超过 CPU 核心数
- 仅在网络瓶颈时启用
5.2 Pipeline 优化
# ❌ 不推荐:逐个操作
for i in range(1000):
redis.set(f"key:{i}", f"value:{i}")
# ✅ 推荐:Pipeline
pipe = redis.pipeline()
for i in range(1000):
pipe.set(f"key:{i}", f"value:{i}")
pipe.execute()
# 性能提升:10-100 倍
5.3 批量操作
# ❌ 不推荐
MSET key1 value1
MSET key2 value2
MSET key3 value3
# ✅ 推荐
MSET key1 value1 key2 value2 key3 value3
# 或使用 Pipeline
redis-cli --pipe < commands.txt
六、大 Key 优化
6.1 大 Key 识别
# 扫描大 Key
redis-cli --bigkeys
# 输出示例
# Biggest string found so far '"key1"' with 1048576 bytes
# Biggest list found so far '"key2"' with 10000 items
# Biggest set found so far '"key3"' with 5000 items
# Biggest hash found so far '"key4"' with 3000 items
6.2 大 Key 处理
# 1. 拆分大 Key
# ❌ 不推荐
HSET user:1001:orders order1 ... order10000
# ✅ 推荐
HSET user:1001:orders:0 order1 ... order1000
HSET user:1001:orders:1 order1001 ... order2000
# 2. 限制数量
LTRIM large_list 0 999 # 保留前 1000 个
# 3. 使用合适结构
# 大 List → 多个小 List
# 大 Hash → 多个小 Hash
# 大 Set → 分片存储
6.3 大 Key 删除
# ❌ 不推荐:直接删除(阻塞)
DEL large_key
# ✅ 推荐:渐进式删除
# 1. 使用 UNLINK(异步删除)
UNLINK large_key
# 2. 分批删除(Hash)
HSCAN large_hash 0 COUNT 100
# 分批删除字段
# 3. 设置过期时间
EXPIRE large_key 1 # 1 秒后过期
七、配置优化
7.1 生产环境配置
# 基础配置
port 6379
bind 192.168.1.1
daemonize yes
pidfile /var/run/redis/redis-server.pid
logfile /var/log/redis/redis-server.log
# 内存配置
maxmemory 4gb
maxmemory-policy allkeys-lru
# 网络配置
tcp-backlog 65535
tcp-keepalive 60
timeout 300
# 持久化配置
save 900 1
save 300 10
appendonly yes
appendfsync everysec
# 安全配置
requirepass your_strong_password
rename-command FLUSHALL ""
rename-command CONFIG ""
# 慢查询配置
slowlog-log-slower-than 10000
slowlog-max-len 128
# 日志配置
loglevel notice
7.2 缓存场景配置
# 纯缓存(最高性能)
save ""
appendonly no
maxmemory-policy allkeys-lru
timeout 300
# 注意:数据可丢失
7.3 高可用场景配置
# 高可用(平衡)
save 900 1
save 300 10
appendonly yes
appendfsync everysec
maxmemory-policy allkeys-lru
aof-use-rdb-preamble yes
# 注意:数据更安全
八、监控与调优
8.1 性能监控
# 实时监控
redis-cli --stat
# 延迟监控
redis-cli --latency
# BigKeys 扫描
redis-cli --bigkeys
# 内存分析
MEMORY STATS
MEMORY DOCTOR
8.2 调优流程
1. 基准测试
redis-benchmark -t SET,GET -n 100000
2. 监控指标
INFO stats
INFO memory
3. 识别瓶颈
SLOWLOG GET 100
redis-cli --bigkeys
4. 优化配置
调整 maxmemory-policy
优化数据结构
5. 验证效果
再次基准测试
对比性能指标
8.3 常见性能问题
| 问题 | 原因 | 解决方案 |
|---|---|---|
| QPS 低 | 网络瓶颈 | 启用 Pipeline |
| 延迟高 | 大 Key 操作 | 拆分大 Key |
| 内存高 | 未设置淘汰 | 配置 maxmemory |
| 碎片高 | 频繁分配释放 | 启用主动碎片整理 |
| 持久化慢 | AOF 频繁刷盘 | 调整 appendfsync |
九、最佳实践
9.1 配置清单
✅ 推荐:
- 设置 maxmemory 和淘汰策略
- 启用 AOF everysec
- 配置慢查询日志
- 使用 Pipeline
- 监控关键指标
❌ 避免:
- KEYS * 命令
- 大 Key 操作
- 未设置内存限制
- 直接 DEL 大 Key
- 忽略慢查询
9.2 性能检查清单
每日检查:
- [ ] 内存使用率 < 90%
- [ ] 命中率 > 80%
- [ ] 慢查询 < 10/天
每周检查:
- [ ] 扫描大 Key
- [ ] 检查碎片率
- [ ] 分析慢查询
每月检查:
- [ ] 性能基准测试
- [ ] 配置优化
- [ ] 容量规划
9.3 调优建议
小数据量(< 1GB):
- 默认配置即可
- 关注慢查询
中等数据量(1-10GB):
- 配置 maxmemory
- 优化数据结构
- 监控碎片率
大数据量(> 10GB):
- 使用 Cluster
- 拆分大 Key
- 专业监控
总结
Redis 性能调优核心要点:
| 优化方向 | 关键配置 | 效果 |
|---|---|---|
| 内存 | maxmemory-policy | 避免 OOM |
| 网络 | tcp-backlog, Pipeline | 提升 QPS |
| 持久化 | appendfsync everysec | 平衡性能/安全 |
| 大 Key | 拆分、UNLINK | 减少阻塞 |
| 监控 | slowlog, —bigkeys | 发现问题 |
最佳实践:
- 基准测试建立性能基线
- 合理配置内存淘汰策略
- 使用 Pipeline 减少网络往返
- 避免大 Key 操作
- 定期监控和调优
- 根据场景选择持久化策略
掌握性能调优,打造高性能 Redis 服务!