Redis的过期策略以及内存淘汰机制

Redis的过期策略以及内存淘汰机制

缓存中存储当前的热点数据,Redis为每个key值都设置了过期时间,以提高缓存命中率。假设你设置了一批key只能存活2个小时,那么当这批key过期后,Redis选择"定期删除+惰性删除"策略。如果该策略失效,Redis内存使用率会越来越高,一般应采用内存淘汰机制来解决。

定期删除

Redis默认每隔100ms就随机抽取一些设置了过期时间的key,检查其是否过期,如果有过期就删除。

随机抽取:是因为假如redis存了几十万个key,每隔100ms就遍历所有设置了过期时间的key,cpu的负载会很高。

"定期"而不是"定时":是因为定时删除需要用一个定时器来负责监视key,过期则自动删除。虽然内存及时释放,但是在高并发请求下,cpu应该把更多的时间用在处理请求上,而不是浪费在删除key上。

惰性删除

定期删除可能会导致很多过期的key到了时间并没有被删除掉,此时就要用到惰性删除。在你请求某个key的时候,redis会检查这个key是否设置了过期时间,并判断是否过期了,如果过期就删除。

定时删除:用cpu的性能换取内存空间(以时间换空间)

定期删除:可能会导致过期的key没被删除

惰性删除:用内存换取cpu的处理时间(以空间换时间)

定期删除+惰性删除 存在的问题

如果定期删除漏掉了很多过期的key,这些key还占用着内存。然后也没即时去请求key,即惰性删除也没生效。这种场景下,Redis默认的"定期删除+惰性删除"策略就失效了。此时,如果大量过期的key堆积在内存中,Redis内存使用率会越来越高,最后导致Redis的内存块耗尽。

对此,可采用内存淘汰机制解决。

Redis中的缓存淘汰策略

当Redis使用的内存达到maxmemory参数配置的阈值时,Redis就会根据配置的内存淘汰策略把key从内存中移除。

LRU 最近最少使用 --- 基于缓存中数据的访问顺序

使用一个链表来跟踪key的访问顺序,当key被访问时将其移动到链表前面。

LFU 最不经常使用 ----基于缓存中每个数据的使用频率

更加关注缓存的使用频率,使用计数器来记录每个key的访问次数,哈希表用于快速查找key。

Random 随机淘汰策略

TTL 生存时间

从设置了过期时间的key里面,挑选出即将要过期的key优先移除。

序号 淘汰策略 策略说明
1 noeviction 当内存不足以容纳新写入数据时,写入操作会报错(一般不用)
2 volatile-lru 对设置了过期时间的key使用LRU算法,最近最少使用的淘汰 缓存数据有明显的冷热之分,即数据的访问频率相差较大
3 volatile-lfu 对设置了过期时间的key使用LFU算法,最不经常使用的淘汰 缓存需要关注数据的历史访问频率
4 volatile-random 对设置了过期时间的key使用随机删除
5 volatile-ttl 从设置了过期时间的key里面,挑选出快要过期的key淘汰
6 allkeys-lru 对所有的key使用LRU算法,最近最少使用的淘汰
7 allkeys-lfu 对所有的key使用LFU算法,最不经常使用的淘汰
8 allkeys-random 对所有的key使用随机删除 缓存数据没有明显的冷热之分,即数据的访问频率差距不大

总结

"定期删除+惰性删除"策略:用于删除过期的缓存数据。

内存淘汰策略:用于在内存不足时,选择要淘汰的缓存数据。

相关推荐
PHP实战开发录几秒前
AI接口结构化输出解析异常排查记录
数据库·安全·ai·php·开发
见山是山-见水是水18 分钟前
拆解网络缓存策略设计:原生鸿蒙页面的实现路径与调试方法
http·缓存·华为·harmonyos
JAVA面经实录91723 分钟前
MySQL问题定位与性能优化完整知识体系
java·jvm·数据库·mysql·性能优化
Rain的Java大神之路28 分钟前
Docker搭建Redis集群完全指南
java·运维·redis·后端·docker·容器·架构
JL1540 分钟前
如何用 MySQL 持久化、历史快照与游标实现多步 Redo/Undo
前端·数据库·mysql
SL-staff41 分钟前
APS排产规则底座实践:如何用生产全局配置统一自动拆分、成批基数与齐套策略
大数据·数据库·人工智能·智能制造·aps·mes·排产规则
Wang's Blog1 小时前
PostgreSQL笔记64:分区插件生态与扩展查询协议深度解析
数据库·笔记·postgresql
小蒜学长1 小时前
基于Django的社区团购购物平台的设计与实现(代码+数据库+LW)
数据库·后端·python·django
刘婉晴1 小时前
【AI提效】利用 qwenwork 智能体平台(免费)实现 webgoat 靶场 SQL 注入速通
数据库·sql
__zRainy__1 小时前
Node系列 · 数据库:MySQL 安装
数据库·后端·mysql·node.js