Redis 内存淘汰策略

Redis 内存淘汰策略 就是:当 Redis 使用内存超过 maxmemory 限制时,Redis 按什么规则删除 key,给新数据腾空间。

核心配置是两个:

conf 复制代码
maxmemory 512mb
maxmemory-policy allkeys-lru

常见淘汰策略

策略 含义
noeviction 不淘汰 key,内存满后写入报错
allkeys-lru 从所有 key 中淘汰最近最少使用的 key
volatile-lru 从设置了过期时间的 key 中淘汰最近最少使用的 key
allkeys-lfu 从所有 key 中淘汰使用频率最低的 key
volatile-lfu 从设置了过期时间的 key 中淘汰使用频率最低的 key
allkeys-random 从所有 key 中随机淘汰
volatile-random 从设置了过期时间的 key 中随机淘汰
volatile-ttl 从设置了过期时间的 key 中优先淘汰快过期的 key

几个关键词

LRU :Least Recently Used,最近最少使用。

谁最近最久没被访问,就先淘汰谁。

LFU :Least Frequently Used,最少频率使用。

谁访问次数少,就先淘汰谁。

volatile :只淘汰设置了过期时间的 key。

如果没有设置 TTL 的 key,就不会被淘汰。

allkeys :所有 key 都可能被淘汰。

不管有没有设置过期时间。

面试里重点比较

对比 区别
allkeys-lru vs volatile-lru 前者所有 key 都能淘汰,后者只淘汰有 TTL 的 key
LRU vs LFU LRU 看最近是否访问,LFU 看访问频率
noeviction 内存满后不删数据,写请求可能失败

一般怎么选?

如果 Redis 主要就是缓存,推荐:

conf 复制代码
allkeys-lru

或者:

conf 复制代码
allkeys-lfu

原因是缓存数据本来就允许被淘汰,Redis 可以自动保留更热的数据。

如果 Redis 里混有不能丢的数据,比如分布式锁、计数器、业务状态,就不能随便用 allkeys-*,否则可能把关键 key 淘汰掉。更稳妥的方式是:

conf 复制代码
volatile-lru

并且只给缓存类 key 设置 TTL。

结合黑马点评项目

店铺详情、优惠券列表这种数据属于缓存,可以接受被淘汰后重新查库加载。

但像秒杀库存、用户登录 token、分布式锁这类 key,就不能随便被 Redis 淘汰,否则会影响业务正确性。

所以项目里可以这样说:

如果 Redis 主要承担缓存角色,可以使用 allkeys-lruallkeys-lfu,让 Redis 在内存不足时自动淘汰冷数据。但如果 Redis 中同时存了业务关键数据,比如分布式锁、登录态、秒杀库存,就要避免使用会淘汰所有 key 的策略,最好把缓存和关键数据隔离到不同 Redis 实例或不同库,并对缓存 key 设置 TTL,使用 volatile-lru 这类策略。

面试回答版

Redis 内存淘汰策略是指 Redis 达到 maxmemory 后如何删除 key。常见策略有 noevictionallkeys-lruvolatile-lruallkeys-lfuvolatile-lfu、随机淘汰和按 TTL 淘汰。

如果 Redis 只作为缓存,一般选择 allkeys-lruallkeys-lfu,自动淘汰冷数据;如果 Redis 里还有分布式锁、库存、登录态等关键数据,就不能让所有 key 都参与淘汰,最好做实例隔离,或者只让设置了过期时间的缓存 key 参与淘汰。

相关推荐
码事漫谈3 小时前
多人共用一个 key,缓存命中率会不会因此降低?
后端
考虑考虑3 小时前
docker compose环境变量替换
运维·后端·自动化运维
武雄(小星Ai)4 小时前
飞书API上传26MB文件偶发失败:错误码9499与空响应体排坑实录
后端·api·排坑实录
徐小夕4 小时前
JitWord 4.0 万字分享:从协同工具到AI Word操作系统,聊聊3年产品创业史
前端·vue.js·后端
geovindu6 小时前
CSharp: Observer Pattern
开发语言·后端·观察者模式·设计模式·c#·.netcore·行为模式
Flynt6 小时前
把公司项目迁到 Spring Boot 4.0:编译通过只是开始
java·spring boot·后端
IT_陈寒7 小时前
Redis误用keys命令把生产环境搞崩了,血的教训
前端·人工智能·后端
她的男孩7 小时前
多租户和数据权限怎么共存?扒完拦截器注册链路,我找到 4 个隐蔽的坑
java·后端·架构
用户8356290780517 小时前
使用 Python 设置 Excel 页眉和页脚
后端·python
步行cgn7 小时前
IoC 控制反转:从概念到 Spring 的实现
后端