Redis性能优化 #
一、性能优化概述 #
1.1 性能瓶颈 #
text
Redis性能瓶颈:
┌─────────────────────────────────────────────┐
│ 1. 内存瓶颈 │
│ - 内存不足 │
│ - 内存碎片 │
│ - 大键 │
│ │
│ 2. CPU瓶颈 │
│ - 复杂命令 │
│ - 大量计算 │
│ │
│ 3. 网络瓶颈 │
│ - 大量小命令 │
│ - 大值传输 │
│ │
│ 4. 持久化瓶颈 │
│ - RDB生成 │
│ - AOF重写 │
└─────────────────────────────────────────────┘
1.2 优化方向 #
text
Redis优化方向:
1. 内存优化
- 减少内存使用
- 降低内存碎片
2. 命令优化
- 使用高效命令
- 避免阻塞命令
3. 网络优化
- 减少网络往返
- 使用管道
4. 配置优化
- 调整配置参数
- 优化持久化
5. 架构优化
- 读写分离
- 集群分片
二、内存优化 #
2.1 内存分析 #
bash
# 查看内存使用
INFO memory
# 重要指标:
# used_memory: 已使用内存
# used_memory_rss: 系统分配内存
# mem_fragmentation_ratio: 内存碎片率
# 查找大键
redis-cli --bigkeys
# 查找内存占用大的键
redis-cli --memkeys
# 查看键的内存占用
MEMORY USAGE key
2.2 数据结构优化 #
bash
# 使用合适的数据结构
# 存储对象:使用Hash
# 不推荐
SET user:1001:name "John"
SET user:1001:age 25
SET user:1001:email "john@example.com"
# 推荐
HSET user:1001 name "John" age 25 email "john@example.com"
# 使用ziplist编码
# 配置hash-max-listpack-entries和hash-max-listpack-value
hash-max-listpack-entries 512
hash-max-listpack-value 64
# 使用intset编码
# Set全是整数时自动使用intset
set-max-intset-entries 512
2.3 键命名优化 #
bash
# 使用简短的键名
# 不推荐
SET user:information:with:id:1001 "data"
# 推荐
SET u:1001 "data"
# 但要保持可读性
SET user:1001 "data"
2.4 过期策略优化 #
bash
# 设置合理的过期时间
SET cache:key "value" EX 3600
# 避免同时大量过期
# 添加随机过期时间
SET cache:key1 "value" EX $((3600 + RANDOM % 600))
SET cache:key2 "value" EX $((3600 + RANDOM % 600))
2.5 内存淘汰策略 #
bash
# 配置内存淘汰策略
maxmemory 2gb
maxmemory-policy allkeys-lru
# 淘汰策略选择:
# volatile-lru: 淘汰设置了过期时间的最近最少使用的键
# allkeys-lru: 淘汰所有最近最少使用的键
# volatile-lfu: 淘汰设置了过期时间的最不常用的键
# allkeys-lfu: 淘汰所有最不常用的键
# volatile-random: 随机淘汰设置了过期时间的键
# allkeys-random: 随机淘汰所有键
# volatile-ttl: 淘汰即将过期的键
# noeviction: 不淘汰,内存满时返回错误
三、命令优化 #
3.1 避免阻塞命令 #
bash
# 不推荐:KEYS命令
KEYS *
# 推荐:SCAN命令
SCAN 0 MATCH pattern* COUNT 100
# 不推荐:HGETALL大哈希
HGETALL big:hash
# 推荐:分批获取
HSCAN big:hash 0 COUNT 100
# 不推荐:SMEMBERS大集合
SMEMBERS big:set
# 推荐:SSCAN
SSCAN big:set 0 COUNT 100
3.2 使用批量命令 #
bash
# 不推荐:多次单操作
SET key1 "value1"
SET key2 "value2"
SET key3 "value3"
# 推荐:批量操作
MSET key1 "value1" key2 "value2" key3 "value3"
# 不推荐:多次获取
GET key1
GET key2
GET key3
# 推荐:批量获取
MGET key1 key2 key3
3.3 使用管道 #
bash
# 使用管道减少网络往返
# redis-cli管道
cat << EOF | redis-cli --pipe
SET key1 "value1"
SET key2 "value2"
SET key3 "value3"
EOF
# Python管道示例
import redis
r = redis.Redis()
pipe = r.pipeline()
pipe.set('key1', 'value1')
pipe.set('key2', 'value2')
pipe.set('key3', 'value3')
pipe.execute()
3.4 使用Lua脚本 #
bash
# 复杂操作使用Lua脚本
# 减少网络往返,保证原子性
# 示例:库存扣减
local stock = tonumber(redis.call('GET', KEYS[1]) or 0)
if stock >= tonumber(ARGV[1]) then
redis.call('DECRBY', KEYS[1], ARGV[1])
return 1
else
return 0
end
四、网络优化 #
4.1 减少网络往返 #
bash
# 使用管道
# 使用批量命令
# 使用Lua脚本
# 避免大值传输
# 大值压缩后存储
4.2 连接池优化 #
python
# Python连接池示例
import redis
# 创建连接池
pool = redis.ConnectionPool(
host='localhost',
port=6379,
max_connections=100,
socket_timeout=5,
socket_connect_timeout=5
)
# 使用连接池
r = redis.Redis(connection_pool=pool)
4.3 客户端缓冲区 #
bash
# 配置客户端缓冲区
# redis.conf
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
五、持久化优化 #
5.1 RDB优化 #
bash
# RDB配置优化
save 900 1
save 300 10
save 60 10000
# 大数据集调整保存频率
save 900 1
save 1800 10
# 关闭RDB(如果使用AOF)
# save ""
# 压缩
rdbcompression yes
# 校验
rdbchecksum yes
5.2 AOF优化 #
bash
# AOF配置优化
appendonly yes
appendfsync everysec
# AOF重写配置
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
# 重写期间禁用fsync(提高性能)
no-appendfsync-on-rewrite yes
# 混合持久化
aof-use-rdb-preamble yes
5.3 持久化策略选择 #
text
持久化策略选择:
1. 只使用RDB
- 允许数据丢失
- 需要快速恢复
- 数据量大
2. 只使用AOF
- 数据安全性要求高
- 不能接受数据丢失
3. 同时使用RDB和AOF
- 生产环境推荐
- 兼顾性能和安全
4. 关闭持久化
- 纯缓存场景
- 数据可以丢失
六、配置优化 #
6.1 基础配置 #
bash
# redis.conf 基础优化
# 最大内存
maxmemory 2gb
# 内存淘汰策略
maxmemory-policy allkeys-lru
# 最大连接数
maxclients 10000
# 超时时间
timeout 300
# TCP keepalive
tcp-keepalive 300
# 慢查询日志
slowlog-log-slower-than 10000
slowlog-max-len 128
6.2 性能配置 #
bash
# 禁用THP
echo never > /sys/kernel/mm/transparent_hugepage/enabled
# 增加文件描述符限制
ulimit -n 65535
# 内核参数优化
vm.overcommit_memory = 1
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
6.3 编码优化 #
bash
# 配置编码转换阈值
# Hash编码
hash-max-listpack-entries 512
hash-max-listpack-value 64
# List编码
list-max-listpack-size -2
# Set编码
set-max-intset-entries 512
# ZSet编码
zset-max-listpack-entries 128
zset-max-listpack-value 64
七、架构优化 #
7.1 读写分离 #
text
读写分离架构:
┌─────────────────────────────────────────────────────────┐
│ 应用程序 │
│ 写操作 读操作 │
└─────────────────────────────────────────────────────────┘
│ │
▼ ▼
┌─────────────────┐ ┌─────────────────┐
│ 主节点 │ │ 从节点 │
│ 写操作 │ │ 读操作 │
└─────────────────┘ └─────────────────┘
优点:
- 分担读压力
- 提高读性能
注意:
- 复制延迟
- 主节点故障
7.2 集群分片 #
text
集群分片架构:
┌─────────────────────────────────────────────────────────┐
│ Redis Cluster │
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Master 1 │ │ Master 2 │ │ Master 3 │ │
│ │ 槽 0-5460 │ │ 槽 5461-10922│ │槽 10923-16383│ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
│ 优点: │
│ - 数据分片 │
│ - 水平扩展 │
│ - 高可用 │
└─────────────────────────────────────────────────────────┘
7.3 多级缓存 #
text
多级缓存架构:
┌─────────────────────────────────────────────────────────┐
│ 应用程序 │
└─────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ 本地缓存 │
│ (进程内缓存) │
└─────────────────────────────────────────────────────────┘
│ Miss
▼
┌─────────────────────────────────────────────────────────┐
│ Redis缓存 │
│ (分布式缓存) │
└─────────────────────────────────────────────────────────┘
│ Miss
▼
┌─────────────────────────────────────────────────────────┐
│ 数据库 │
└─────────────────────────────────────────────────────────┘
优点:
- 减少Redis压力
- 提高响应速度
八、性能测试 #
8.1 redis-benchmark #
bash
# 基准测试
redis-benchmark -t set,get -n 100000 -q
# 输出示例:
# SET: 102564.10 requests per second
# GET: 105263.16 requests per second
# 完整测试
redis-benchmark -h 127.0.0.1 -p 6379 -c 50 -n 100000
# 测试特定命令
redis-benchmark -t set,get,lpush,lpop -n 100000 -q
# 测试管道
redis-benchmark -P 10 -n 100000 -q
# 测试不同数据大小
redis-benchmark -d 1000 -n 100000 -q
8.2 性能指标 #
text
Redis性能指标:
┌─────────────────────────────────────────────────────────┐
│ 指标 │ 正常范围 │
├─────────────────────────────────────────────────────────┤
│ QPS │ 10万+ │
│ 响应时间 │ < 1ms │
│ 内存使用率 │ < 80% │
│ 内存碎片率 │ 1.0 - 1.5 │
│ 连接数 │ < maxclients │
│ 持久化延迟 │ < 1s │
└─────────────────────────────────────────────────────────┘
九、总结 #
内存优化:
| 方法 | 说明 |
|---|---|
| 数据结构选择 | 使用合适的类型 |
| 键命名优化 | 简短有意义 |
| 过期策略 | 设置合理过期 |
| 淘汰策略 | allkeys-lru |
命令优化:
| 方法 | 说明 |
|---|---|
| 避免阻塞命令 | 使用SCAN代替KEYS |
| 批量操作 | MSET/MGET |
| 管道 | 减少网络往返 |
| Lua脚本 | 复杂原子操作 |
配置优化:
| 配置项 | 推荐值 |
|---|---|
| maxmemory | 物理内存60-80% |
| maxmemory-policy | allkeys-lru |
| appendfsync | everysec |
| slowlog-log-slower-than | 10000 |
恭喜你完成了Redis完全指南的学习!
最后更新:2026-03-27