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使用随机删除 缓存数据没有明显的冷热之分,即数据的访问频率差距不大

总结

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

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

相关推荐
r i c k21 分钟前
数据库系统学习笔记
数据库·笔记·学习
野犬寒鸦35 分钟前
从零起步学习JVM || 第一章:类加载器与双亲委派机制模型详解
java·jvm·数据库·后端·学习
IvorySQL1 小时前
PostgreSQL 分区表的 ALTER TABLE 语句执行机制解析
数据库·postgresql·开源
·云扬·2 小时前
MySQL 8.0 Redo Log 归档与禁用实战指南
android·数据库·mysql
IT邦德2 小时前
Oracle 26ai DataGuard 搭建(RAC到单机)
数据库·oracle
惊讶的猫2 小时前
redis分片集群
数据库·redis·缓存·分片集群·海量数据存储·高并发写
不爱缺氧i2 小时前
完全卸载MariaDB
数据库·mariadb
期待のcode2 小时前
Redis的主从复制与集群
运维·服务器·redis
纤纡.2 小时前
Linux中SQL 从基础到进阶:五大分类详解与表结构操作(ALTER/DROP)全攻略
linux·数据库·sql
jiunian_cn2 小时前
【Redis】渐进式遍历
数据库·redis·缓存