Redis内存淘汰策略maxmemory
Redis 的内存淘汰策略 maxmemory-policy 决定了当内存达到上限时,Redis 如何选择要删除的键。
如果你不设置,Redis 在内存满时可能直接返回错误,导致写入失败。
本文从零开始,带你理解 8 种策略的区别,并一步步完成配置和验证。
为什么需要设置 maxmemory-policy
Redis 作为缓存或数据库,内存是有限资源。
当 used_memory 超过 maxmemory 时,如果没有淘汰策略,Redis 会拒绝所有写命令并返回 OOM command not allowed when used memory > 'maxmemory'。
设置合适的策略可以让 Redis 自动清理旧数据,保证服务可用。
关键结论:只有设置了 maxmemory 且值大于 0 时,maxmemory-policy 才会生效。
8 种淘汰策略快速对比
- noeviction:默认策略,不淘汰任何键,内存满时写命令报错。适合数据不能丢失的场景。
- volatile-lru:从设置了过期时间的键中,淘汰最近最少使用的键。
- volatile-lfu:从设置了过期时间的键中,淘汰访问频率最低的键(Redis 4.0+)。
- volatile-random:从设置了过期时间的键中随机淘汰。
- volatile-ttl:从设置了过期时间的键中,淘汰剩余生存时间最短的键。
- allkeys-lru:从所有键中淘汰最近最少使用的键。适合纯缓存场景。
- allkeys-lfu:从所有键中淘汰访问频率最低的键(Redis 4.0+)。
- allkeys-random:从所有键中随机淘汰。
判断条件:如果数据都设置了过期时间,可以用 volatile-* 系列;
如果所有数据都允许淘汰,用 allkeys-* 系列。
配置 maxmemory-policy 的两种方法
方法一:修改配置文件(永久生效)
- 找到 Redis 配置文件,通常位于
/etc/redis/redis.conf或安装目录下。 - 编辑文件,添加或修改以下两行:
maxmemory 2gb
maxmemory-policy allkeys-lru
- 保存后重启 Redis 服务:
sudo systemctl restart redis
方法二:通过命令行动态设置(临时生效)
连接 Redis 后执行:
redis-cli config set maxmemory 2gb
redis-cli config set maxmemory-policy allkeys-lru
动态设置重启后失效,适合测试。
验证策略是否生效
- 查看当前配置:
redis-cli config get maxmemory
redis-cli config get maxmemory-policy
- 查看内存使用和淘汰统计:
redis-cli info memory | grep used_memory_human
redis-cli info stats | grep evicted_keys
如果 evicted_keys 持续增加,说明淘汰正在工作。
避坑指南
- 不要在生产环境使用 noeviction 却不监控内存,否则写入会失败。
- volatile-* 策略可能无键可淘汰:如果没有键设置过期时间,内存满时依然会报错。
- LRU 和 LFU 不是精确算法,Redis 使用近似采样,受
maxmemory-samples影响。 - 修改 maxmemory 后要观察一段时间,避免淘汰过快导致缓存命中率下降。
常见疑问
maxmemory-policy 应该选哪个?
如果 Redis 只做缓存,推荐 allkeys-lru;如果部分数据需要持久化,用 volatile-lru 并确保设置了过期时间。
设置了策略为什么还是 OOM?
检查 maxmemory 是否大于 0,以及策略是否为 noeviction。另外,从节点和主节点的策略可能不同。
LRU 和 LFU 哪个好?
LFU 更适合热点数据稳定的场景,LRU 适合访问模式变化快的场景。Redis 4.0 以上才支持 LFU。
配置完成后,建议用 redis-cli --stat 实时观察内存和淘汰情况。
如果问题依旧,优先检查 maxmemory 设置和键的过期时间分布。