【TECH】Redis缓存淘汰策略

应用系统分层架构,为了加速数据访问,会把最常访问的数据,放在缓存(cache)里,避免每次都去访问数据库。缓存是指,将一些需要读取数据放在磁盘或者内存中,由于追求速度从而一般是放在内存中。缓存容量有限,若缓存满了系统是如何淘汰一些数据的呢?就涉及到缓存淘汰策略

三种缓存淘汰策略:

1.FIFO- First In First Out - 先进先出
2.LFU - Least Frequently Used - 最少 - 使用
3.LRU - Least Recently Used - 最近 - 最少 - 使用

redis三种过期key的删除策略

redis中当一个key过期了,并不是立即从Redis中删除。而是以下三种方式:

1、立即删除:

2、惰性删除:key到达过期时间时,不做处理。等到下次访问时判断,如果过期则删除key,未过期则返回数据。

3、定期删除:定期删除策略是前两种策略的折中,定期删除策略每隔一段时间执行一次删除过期键操作,并通过限制删除操作执行的时长和频率来减少删除操作对CPU时间的影响。

Redis采用的是惰性删除+定期删除的方案。Redis 的定期扫描只会扫描设置了过期时间的键,Redis 通过一个单独的过期字典expires(可以看作是 hash 表)来保存设置了过期时间的数据过期的时间,所以不会出现扫描所有键的情况,即使如此,redis也是默认是每隔 100ms 就随机抽取过期字典中的 key,检查其是否过期,如果过期就删除。如果不定时随机抽查而是全部扫描,那么将可能有很长的时间导致服务对外不可用,这是无异于一场灾难。

由于是随机扫描,那么对于已经过期但没有被扫描到的key怎么办呢,没关系,还有惰性删除,在获取某个 key 的时候,Redis 会检查一下 ,这个 key 如果设置了过期时间那么是否过期了?如果过期了此时就会删除,返回null。

过期字典dict的key是一个指针,这个指针指向键空间中的某个key对象(也即是某个数据库键)。过期字典的值是一个long long类型的整数,这个整数保存了key所指向的数据库key的过期时间——一个毫秒精度的UNIX时间戳。在实际中,键空间的key和过期字典的key都指向同一个key对象,所以不会出现任何重复对象,也不会浪费任何空间。

Redis缓存的八种淘汰策略​​​​​​​

noeviction: 不会驱逐任何key,即当内存超出限制后,报错返回OOM,但不驱逐任何key(出厂默认配置)

allkeys-lru: 对所有key使用LRU算法进行删除(推荐)

volatile-lru: 对所有设置了过期时间的key使用LRU算法进行删除

allkeys-random: 对所有key随机删除

volatile-random: 对所有设置了过期时间的key随机删除

volatile-ttl: 删除马上要过期的key

allkeys-lfu: 对所有key使用LFU算法进行删除

volatile-lfu: 对所有设置了过期时间的key使用LFU算法进行删除

​​​​​​​

猜你喜欢

转载自blog.csdn.net/MrChenLen/article/details/114396640