Skip to content
清晨的一缕阳光
返回

Redis 性能调优实战

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     # 是否多线程处理读命令

注意

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发现问题

最佳实践

  1. 基准测试建立性能基线
  2. 合理配置内存淘汰策略
  3. 使用 Pipeline 减少网络往返
  4. 避免大 Key 操作
  5. 定期监控和调优
  6. 根据场景选择持久化策略

掌握性能调优,打造高性能 Redis 服务!

参考资料


分享这篇文章到:

上一篇文章
Go 并发编程核心机制
下一篇文章
大规模 Agent 系统设计实战