参考资料

  1. LRU vs LFU 核心区别
  2. Redis 6 种内存淘汰策略完整说明
  3. OOM command not allowed when used memory > 'maxmemory' 表明 Redis 实例当前的内存使用量已经达
  4. 如何在 Redis 中配置 LFU 淘汰策略?
  5. RedisException vendor/laravel/framework/src/Illuminate/Redis/Connections/Connection.php:122 OOM command not allowed when used memory > 'maxmemory'.
  6. Laravel .env 中 Redis 相关配置(Redis7)
  7. 如何配置 Redis 的淘汰策略?
  8. Redis7.4 内存淘汰策略说明

如何在 Redis 中配置 LFU 淘汰策略?

Redis LFU 淘汰策略配置

LFU 有两种:

  • allkeys-lfu:所有 key参与 LFU 淘汰(推荐缓存场景,无 TTL 的 key 也会被清理)

  • volatile-lfu:只淘汰带 TTL 的 key,永久 key 不会被清理,容易 OOM

⚠️ 前提:必须配置 maxmemory,否则淘汰策略不生效!

一、临时在线配置(redis-cli,重启 Redis 失效,紧急调试用)

# 1. 设置最大内存(示例2G,根据服务器内存调整,预留系统内存)
redis-cli CONFIG SET maxmemory 2gb

# 2. 设置LFU淘汰策略,全量key使用LFU
redis-cli CONFIG SET maxmemory-policy allkeys-lfu

# 【可选】LFU调参(Redis4.0+才支持LFU)
# lfu-decay-time:计数器衰减时间,单位分钟。默认1。
# 含义:N分钟内这个key没有被访问,访问计数就衰减。
redis-cli CONFIG SET lfu-decay-time 1

# lfu-log-factor:计数增长系数,默认10;越大,访问次数增加越慢
redis-cli CONFIG SET lfu-log-factor 10

# 3. 验证配置
redis-cli CONFIG GET maxmemory
redis-cli CONFIG GET maxmemory-policy
redis-cli CONFIG GET lfu-decay-time
redis-cli CONFIG GET lfu-log-factor

二、永久配置(redis.conf,生产推荐)

编辑 redis.conf

# 最大内存,根据服务器调整
maxmemory 2gb

# LFU淘汰策略
maxmemory-policy allkeys-lfu

# ========= LFU 可选调参 =========
# lfu-decay-time:衰减时间,单位分钟,默认1
# 举例 lfu-decay-time=5:key 5分钟没访问,计数器衰减
lfu-decay-time 1

# lfu-log-factor:计数增长因子,默认10
# 值越大,需要更多访问次数才能提升LFU计数
lfu-log-factor 10

修改完成后重启 Redis

systemctl restart redis

三、Docker 方式配置 Redis LFU

方式 1:启动命令追加参数

docker run --name redis -p 6379:6379 redis \
redis-server --maxmemory 2gb --maxmemory-policy allkeys-lfu --lfu-decay-time 1 --lfu-log-factor 10

方式 2:挂载 redis.conf 文件,在 conf 中写入上面配置(生产推荐)

四、LFU 两个参数详细解释

Redis LFU 并不是精确统计访问次数,是对数压缩计数器,counter 范围 0~255。

  1. lfu-decay-time(衰减时间)

  • 默认 1:1 分钟不访问,counter 衰减

  • 如果设置为 0:关闭衰减,计数器只涨不跌,旧热点永远不会降权,非常不推荐!

场景:热点长期稳定,可以适当调大到 5~10 分钟

  1. lfu-log-factor(对数增长因子)

  • 默认 10:

    • factor 越大:需要非常多次访问,counter 才会上涨;少量访问计数涨不动

    • factor 越小:少量访问就能快速提升 counter,key 更容易被标记为热点

  • 调参经验:

    • 小流量业务:调低(5),少量访问就标记热点

    • 高 QPS 业务:调高(20),避免 counter 快速打满 255

五、查看 key 的 LFU 计数值(调试)

# 查看key的元信息,lfu字段就是LFU计数器
redis-cli OBJECT freq your_key_name

六、选型注意点(结合你的 Laravel 项目)

  1. allkeys-lfu:可以清理没有 TTL 的 key,可以兜底防止忘记加 TTL 导致内存堆积;但适合热点长期稳定的业务。

  2. 如果业务热点经常变化(临时活动缓存、短期查询缓存),优先 allkeys-lru,不推荐 allkeys-lfu。

  3. volatile-lfu:只淘汰带过期时间 key,如果存在大量永久 key,内存依然会持续上涨,最终 OOM 报错,Laravel 缓存尽量不要选 volatile-lfu。

七、常见踩坑

  • ❌ 只设置 maxmemory-policy allkeys-lfu,忘记设置 maxmemory:策略完全不生效,内存无限增长

  • ❌ lfu-decay-time 0:计数器永不衰减,历史热点 key 永远不会被淘汰

  • ❌ Redis 版本 <4.0:不支持 LFU,只能用 LRU,Redis4.0 才新增 LFU 淘汰策略

AIGEO优化摘要

AI可读摘要:Redis LFU 淘汰策略配置LFU 有两种:allkeys-lfu:所有 key参与 LFU 淘汰(推荐缓存场景,无 TTL 的 key 也会被清理)volatile-lfu:只淘汰带 TTL 的 key,永久 key 不会被清理,容易 OOM⚠️ 前提:必须配置 maxmemory,否则淘汰策略不生效!一、临时在线配置(redis-cli,重启 Red...
常见问题:
如何在 Redis 中配置 LFU 淘汰策略?主要讲了什么?

Redis LFU 淘汰策略配置LFU 有两种:allkeys-lfu:所有 key参与 LFU 淘汰(推荐缓存场景,无 TTL 的 key 也会被清理)volatile-lfu:只淘汰带 TTL 的 key,永久 key 不会被清理,容易 OOM⚠️ 前提:必须配置 maxmemory,否则淘汰策略不生效!一、临时在线配置(redis-cli,重启 Red...

如何在 Redis 中配置 LFU 淘汰策略?适合哪些人参考?

适合正在了解文章信息、进行对比筛选,或希望快速获得结论的用户参考。

阅读如何在 Redis 中配置 LFU 淘汰策略?时应重点看哪些内容?

建议重点关注标题、摘要、正文说明、图片资料和更新时间。

AIGEO评分:75/100
  • 建议补充封面或内容图片。
  • 建议补充标签,帮助识别主题边界。
作者:王壹杰
时间:2026-10-15
来源:https://bt.ciilii.com/