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