跳转至

第七章:性能优化

内存优化

内存配置

# redis.conf
maxmemory 4gb                    # 最大内存
maxmemory-policy allkeys-lru     # 淘汰策略

淘汰策略

淘汰策略选项:
- volatile-lru: 淘汰最近最少使用的过期键
- allkeys-lru: 淘汰最近最少使用的所有键
- volatile-lfu: 淘汰最不经常使用的过期键
- allkeys-lfu: 淘汰最不经常使用的所有键
- volatile-random: 随机淘汰过期键
- allkeys-random: 随机淘汰所有键
- volatile-ttl: 淘汰即将过期的键
- noeviction: 不淘汰,内存满时返回错误

内存分析

# 查看内存使用
127.0.0.1:6379> info memory
used_memory:1073741824
used_memory_human:1.00G
used_memory_peak:2147483648
used_memory_peak_human:2.00G

# 查看大键
127.0.0.1:6379> memory usage user:1
(integer) 1024

# 分析键分布
redis-cli --bigkeys

网络优化

连接配置

# redis.conf
tcp-backlog 511           # TCP 连接队列
tcp-keepalive 300         # TCP 保活时间
timeout 0                 # 客户端空闲超时
maxclients 10000          # 最大连接数

网络参数

# 系统网络参数
sysctl -w net.core.somaxconn=65535
sysctl -w net.ipv4.tcp_max_syn_backlog=65535
sysctl -w net.ipv4.tcp_tw_reuse=1

慢查询

# redis.conf
slowlog-log-slower-than 10000  # 慢查询阈值(微秒)
slowlog-max-len 128            # 慢查询日志长度

# 查看慢查询
127.0.0.1:6379> slowlog get 10

命令优化

批量操作

# 不推荐:多次单键操作
SET key1 value1
SET key2 value2
SET key3 value3

# 推荐:批量操作
MSET key1 value1 key2 value2 key3 value3

管道操作

# Python 管道
with rc.pipeline() as pipe:
    for i in range(1000):
        pipe.set(f'key:{i}', f'value:{i}')
    pipe.execute()

避免阻塞命令

# 避免:阻塞命令
KEYS *           # 阻塞,扫描所有键
HGETALL bigkey   # 阻塞,获取大哈希

# 推荐:替代方案
SCAN 0 MATCH pattern COUNT 100
HSCAN bigkey 0

持久化优化

RDB 配置

# redis.conf
save 900 1       # 900秒内至少1次修改
save 300 10      # 300秒内至少10次修改
save 60 10000    # 60秒内至少10000次修改

rdbcompression yes    # RDB 压缩
rdbchecksum yes       # RDB 校验

AOF 配置

# redis.conf
appendonly yes              # 启用 AOF
appendfsync everysec        # 同步策略
auto-aof-rewrite-percentage 100  # 重写阈值
auto-aof-rewrite-min-size 64mb    # 重写最小大小

混合持久化

# redis.conf
aof-use-rdb-preamble yes    # 混合持久化

集群优化

槽位平衡

# 检查槽位分布
redis-cli --cluster info 192.168.1.101:6379

# 平衡槽位
redis-cli --cluster rebalance 192.168.1.101:6379

节点优化

# redis.conf
cluster-node-timeout 5000          # 节点超时
cluster-require-full-coverage yes  # 需要完整覆盖

客户端优化

# Python 客户端优化
rc = RedisCluster(
    startup_nodes=startup_nodes,
    max_connections=100,           # 连接池大小
    socket_timeout=5,              # Socket 超时
    socket_connect_timeout=5,      # 连接超时
    retry_on_timeout=True,         # 超时重试
)

性能测试

redis-benchmark

# 基准测试
redis-benchmark -h 192.168.1.101 -p 6379 -c 100 -n 100000

# 测试特定命令
redis-benchmark -h 192.168.1.101 -p 6379 -t set,get -n 100000

# 测试集群
redis-benchmark -h 192.168.1.101 -p 6379 --cluster -c 100 -n 100000

性能指标

关键性能指标:
- QPS: 每秒查询数
- 延迟: 平均延迟、P99 延迟
- 内存: 内存使用率
- 连接: 连接数
- 命中率: 缓存命中率

小结

性能优化要点:

  • 内存优化:内存配置、淘汰策略、内存分析
  • 网络优化:连接配置、网络参数、慢查询
  • 命令优化:批量操作、管道操作、避免阻塞
  • 持久化优化:RDB、AOF、混合持久化
  • 集群优化:槽位平衡、节点优化、客户端优化
  • 性能测试:redis-benchmark、性能指标

下一章我们将学习生产实践。