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 参与淘汰。

相关推荐
zhengzizhe1 小时前
ReBAC 与 Google Zanzibar:权限系统的未来
后端·架构
用户8356290780511 小时前
使用 Python 自动创建 Excel 折线图
后端·python
梅兮昂2 小时前
Cloudflare Tunnel 实践教程
后端
倒流时光三十年2 小时前
PostgreSQL VACUUM 清理机制详解
后端
折哥的程序人生 · 物流技术专研3 小时前
《Java面试85题图解版(二)》进阶深化中篇:Spring核心 + 数据库进阶
java·后端·spring·面试
TeamDev3 小时前
在 Excel 加载项中嵌入 Web 视图
前端·后端·.net
Mr_愚人派3 小时前
redis_点评详解(02.短信登录-验证码登录注册)
后端
Xidaoapi3 小时前
5分钟让你的Python项目接入GPT-4:从配置到上线的完整指南
后端
SamDeepThinking3 小时前
写代码不考虑前后兼容,迟早要还的
java·后端·程序员