8.2.4 内存管理与淘汰策略优化

内存管理与淘汰策略优化#

Redis 内存管理以 maxmemory 为核心,限制实例可用内存,避免系统 OOM。建议根据实例角色与业务峰值设置,并为操作系统预留内存。

文章图片

1)安装与配置示例(含内存上限与淘汰策略)#

以下示例以二进制包安装为例,并配置内存与淘汰策略:

# 1. 下载并安装(示例以 7.x 为例)
wget https://download.redis.io/releases/redis-7.2.4.tar.gz
tar -zxvf redis-7.2.4.tar.gz && cd redis-7.2.4
make && sudo make install

# 2. 创建目录结构
sudo mkdir -p /etc/redis /var/lib/redis /var/log/redis
sudo cp redis.conf /etc/redis/redis.conf

# 3. 修改配置
sudo sed -i 's/^daemonize no/daemonize yes/' /etc/redis/redis.conf
sudo sed -i 's#^dir .*#dir /var/lib/redis#' /etc/redis/redis.conf
sudo sed -i 's/^logfile .*/logfile "\/var\/log\/redis\/redis.log"/' /etc/redis/redis.conf

# 4. 设置内存上限与淘汰策略
sudo tee -a /etc/redis/redis.conf >/dev/null <<'EOF'
maxmemory 4gb
maxmemory-policy allkeys-lfu
# 高频过期检测(谨慎调高)
hz 20
active-expire-effort 5
# 开启主动碎片整理(4.0+)
active-defrag yes
EOF

# 5. 启动服务
redis-server /etc/redis/redis.conf
redis-cli ping

命令解释:
- maxmemory 4gb:限制 Redis 最大可用内存为 4GB。
- maxmemory-policy allkeys-lfu:超限时按访问频率淘汰全量键。
- hzactive-expire-effort:提高主动过期频率(注意 CPU 影响)。
- active-defrag yes:开启碎片整理以降低 mem_fragmentation_ratio


2)关键指标与诊断命令(含示例与预期效果)#

# 查看内存指标
redis-cli info memory

# 关注以下字段
# used_memory: 逻辑内存
# used_memory_rss: 物理内存
# mem_fragmentation_ratio: 碎片率

# 示例输出(节选)
# used_memory: 102345678
# used_memory_rss: 156000000
# mem_fragmentation_ratio: 1.52

# 查询大Key内存占用
redis-cli memory usage user:1001

预期效果:
- mem_fragmentation_ratio 1.1~1.5 为可接受区间;>1.5 建议优化。
- memory usage <key> 可定位大 Key,便于拆分或降级存储结构。


3)淘汰策略对比与配置选择(含压测验证命令)#

策略选择建议结合业务可重建性与访问分布:

  • noeviction:强一致,写入触顶拒绝。
  • volatile-*:只淘汰设置过期的键。
  • allkeys-lru/lfu:全量键淘汰,纯缓存首选。
  • allkeys-lfu:热点明显时命中率更高。

压测验证示例:

# 使用 redis-benchmark 模拟访问分布(热点)
redis-benchmark -h 127.0.0.1 -p 6379 -t get,set -n 100000 \
  -d 256 -r 10000 --csv

# 切换策略后观察命中率变化
redis-cli config set maxmemory-policy allkeys-lru
redis-cli config get maxmemory-policy

4)碎片率优化与排错示例#

常见碎片来源:大对象频繁删除、过期集中触发。优化建议:

  • 拆分大 Key,避免超大 Hash/List。
  • 分批设置过期时间,避免同一时间集中失效。
  • 开启 active-defrag 并调节阈值。

排错示例:内存碎片率过高

# 1. 查看内存碎片率
redis-cli info memory | egrep "used_memory_rss|used_memory:|mem_fragmentation_ratio"

# 2. 开启主动碎片整理
redis-cli config set active-defrag yes

# 3. 验证
redis-cli info memory | grep mem_fragmentation_ratio

预期结果:
- mem_fragmentation_ratio 逐步下降(非立即生效)。


5)过期策略与热点 Key 处理示例#

过期策略为惰性 + 定期;热点 Key 需设置合理 TTL,避免雪崩。

# 设置随机过期,避免集中失效
for i in $(seq 1 10000); do
  ttl=$((RANDOM%3600+600))
  redis-cli set user:${i} "data-${i}" EX $ttl >/dev/null
done

# 查看过期统计
redis-cli info stats | grep expired_keys

6)容器环境内存协同配置示例#

容器限制应与 maxmemory 协同,防止 RSS 超限。

# Docker 运行 Redis,限制容器 6GB
docker run -d --name redis \
  -p 6379:6379 \
  --memory=6g \
  redis:7.2 \
  redis-server --maxmemory 4gb --maxmemory-policy allkeys-lfu

7)练习题(含操作目标)#

  1. 配置 maxmemory 2gballkeys-lru,写入 3GB 数据,观察写入行为与淘汰日志。
  2. 使用 memory usage 找出占用最大的 3 个 Key,并拆分为小 Hash。
  3. 调高 active-expire-effort,观察 expired_keys 增速与 CPU 变化。
# 练习辅助命令:批量写入大对象
for i in $(seq 1 2000); do
  redis-cli set bigkey:${i} "$(head -c 2048 </dev/urandom | base64)" >/dev/null
done
redis-cli memory usage bigkey:1

以上内容覆盖内存上限设置、淘汰策略选择、碎片治理、过期策略与容器协同配置,并提供安装、排错、命令解释与练习示例。