redis内存淘汰策略共8种,本质是淘汰范围(所有key或仅带过期时间的key)与淘汰依据(lru、lfu、ttl、random)的组合;必须配置maxmemory才生效,默认为0即不触发淘汰。

Redis 内存淘汰策略共 8 种,本质是两个维度的组合:淘汰范围(所有 key 或 仅带过期时间的 key) + 淘汰依据(LRU、LFU、TTL、Random)。选对策略的关键不是背名字,而是看你的数据有没有过期时间、能不能丢、以及访问模式是偏时间局部性还是频率集中性。
先确认前提:必须设 maxmemory 才会生效
淘汰策略不会自动启动。默认 maxmemory 是 0(不限制),此时无论配什么策略都无效。
- 运行时设置:
CONFIG SET maxmemory 2gb - 配置文件永久生效:
maxmemory 2gb写入redis.conf - 不设上限,
maxmemory-policy就是摆设
8 种策略怎么分组理解
按实际作用划为三类,比死记硬背更可靠:
-
不淘汰(只拒写):
noeviction—— 内存满后所有写命令报(error) OOM command not allowed...,读和删仍可操作。适合 Redis 当持久化数据库用(如任务队列),不适合缓存。 -
只在带过期时间的 key 里挑(volatile-*):
volatile-lru、volatile-lfu、volatile-random、volatile-ttl。
→ 如果你所有缓存都设了 TTL(比如 session、token、验证码),这类策略最安全:永久数据(如配置、字典表)完全不受影响。 -
在所有 key 里挑(allkeys-*):
allkeys-lru、allkeys-lfu、allkeys-random。
→ 适合纯缓存场景,所有数据都可丢。但要注意:如果混存了长期有效的业务数据,可能误删。
主流场景推荐策略
不用纠结“最优”,看业务特征匹配:
-
通用缓存系统(推荐首选):
allkeys-lru
→ 大多数 Web 缓存访问有明显时间局部性(刚查过的商品、文章很快又被点),近似 LRU 能较好保留热点。采样数(maxmemory-samples)建议调到 10(默认 5),提升淘汰准确性。 -
缓存+少量永久数据共存:
volatile-lru
→ 比如 Redis 同时存用户 session(带 TTL)和系统配置(永不过期)。此策略只动 session,配置稳如泰山。注意:若误设大量无 TTL 的缓存,它会退化成noeviction(因为没候选 key 可删)。 -
时效性强的临时数据:
volatile-ttl
→ 验证码、短信 token、短期会话。谁快过期谁先走,避免内存被“僵尸”数据占着不放。 -
长尾访问、冷热区分明显:
allkeys-lfu(Redis 4.0+)
→ 视频平台首页推荐、搜索热词等,某些内容访问频次极高且稳定,LFU 比 LRU 更能识别真正“高频”,减少误删。
配置命令与验证
改完别忘了检查是否生效:
- 设策略:
CONFIG SET maxmemory-policy allkeys-lru - 查当前策略:
CONFIG GET maxmemory-policy - 查内存使用:
INFO memory | grep -E "(used_memory|maxmemory)" - 观察淘汰行为:
INFO stats | grep evicted_keys—— 这个值持续增长,说明淘汰已工作
策略本身不复杂,但容易忽略前提和边界情况。设了 maxmemory 才算真正起步,再根据数据生命周期和访问规律选范围(volatile/allkeys)和算法(LRU/LFU/TTL),基本就覆盖了绝大多数生产需求。











