8.5.2 内存与持久化优化

本节聚焦 Redis 内存与持久化的优化目标:在保证数据安全与可恢复性的前提下,降低内存碎片与持久化开销,提升吞吐与稳定性。

原理草图:内存与持久化数据流

文章图片

内存使用优化要点与示例
- 内存上限与淘汰策略:合理设置 maxmemory,并结合业务场景选择淘汰策略(如 allkeys-lruvolatile-lruallkeys-lfu)。
- 内存碎片控制:通过 INFO memory 观察 mem_fragmentation_ratio,必要时启用 active-defrag
- 数据结构与编码优化:合理配置 listpack/intset 相关阈值,减少小对象膨胀。
- 大 Key 与热 Key 治理:拆分大 Key、限制单 Key 体积。
- 过期策略优化:合理设置 TTL,避免集中到期抖动。

安装/配置示例:在已有 Redis 上优化内存与持久化

# 假设已安装redis-server,编辑配置文件
sudo vim /etc/redis/redis.conf

# 内存与淘汰策略
maxmemory 4gb
maxmemory-policy allkeys-lfu

# 碎片整理(Redis 4.0+)
active-defrag yes
hz 20

# 小对象编码阈值(示例)
hash-max-listpack-entries 512
hash-max-listpack-value 64
list-max-listpack-entries 512
list-max-listpack-value 64

# 持久化策略
save 900 1
save 300 10
save 60 10000
appendonly yes
appendfsync everysec
aof-use-rdb-preamble yes
no-appendfsync-on-rewrite yes

命令解释与验证

# 1) 查看内存与碎片
redis-cli INFO memory
# 重点字段:
# used_memory           当前使用内存
# used_memory_rss       进程占用内存
# mem_fragmentation_ratio 内存碎片比率(>1.5需关注)

# 2) 查看持久化状态
redis-cli INFO persistence
# 重点字段:
# rdb_bgsave_in_progress / aof_rewrite_in_progress
# latest_fork_usec      fork耗时,过高说明压力大

# 3) 查看当前淘汰策略
redis-cli CONFIG GET maxmemory-policy

# 4) 模拟大Key并观察内存变化
redis-cli --raw SET bigkey "$(head -c 5M /dev/urandom | base64)"
redis-cli INFO memory | grep used_memory_human

# 5) 触发RDB与AOF重写
redis-cli BGSAVE
redis-cli BGREWRITEAOF

持久化性能优化示例:高写入场景配置

# /etc/redis/redis.conf 关键片段
appendonly yes
appendfsync everysec      # 性能与安全折中
no-appendfsync-on-rewrite yes
aof-use-rdb-preamble yes  # 缩短恢复时间

排错步骤示例:内存异常上涨与持久化卡顿

# 1) 内存异常上涨排查
redis-cli --raw MEMORY STATS
redis-cli --raw MEMORY DOCTOR
# 解释:MEMORY STATS展示分配器、碎片等;
# MEMORY DOCTOR给出诊断建议。

# 2) 大Key排查
redis-cli --raw --scan | head -n 1000 > /tmp/keys.sample
# 使用redis-cli --bigkeys(会阻塞,建议在低峰期)
redis-cli --bigkeys

# 3) 持久化卡顿排查
redis-cli INFO persistence | egrep "rdb_bgsave_in_progress|aof_rewrite_in_progress|latest_fork_usec"
iostat -x 1 5   # 观察磁盘IO

故障恢复示例:AOF过大导致恢复慢

# 1) 备份AOF
cp /var/lib/redis/appendonly.aof /var/lib/redis/appendonly.aof.bak

# 2) 使用redis-check-aof修复
redis-check-aof --fix /var/lib/redis/appendonly.aof

# 3) 重启服务并验证
systemctl restart redis
redis-cli PING

练习
1. 设置 maxmemory 为 1gb,策略为 allkeys-lru,写入 2gb 数据,观察淘汰是否发生,并记录 evicted_keys
2. 开启 appendonly yesaof-use-rdb-preamble yes,对比启用前后的启动恢复时间。
3. 人为制造大 Key(如 10MB 字符串),使用 --bigkeys 找出并拆分,记录拆分后内存变化。