Redis的内存淘汰机制和删除策略

2022年9月25日12:15:55

Redis内存淘汰机制

Redis内存淘汰指的是用户存储的一些键被可以被Redis主动地从实例中删除。内存的淘汰机制的初衷是为了更好地使用内存。

配置

我们可以通过配置redis.conf中的maxmemory这个值来开启内存淘汰功能,这个值的大小一般设置为Redis容量的15%-30%,因为我们查询的数据大部分都在这15%-30%,我们只缓存这么多的数据,兼顾访问性能和内存空间开销。
同时Redis也支持运行期间修改淘汰策略,这使得我们不需要重启Redis实例而实时的调整内存淘汰策略。
设置命令:config set maxmemory 5gb(设置5GB为例)
查看命令:config get maxmemory

淘汰策略在 Redis 4.0 版本之前有 6 种策略,4.0 增加了 2种,主要新增了 LFU 算法。
Redis的内存淘汰机制和删除策略

淘汰策略配置:maxmemory-policy noeviction
修改配置文件:config set maxmemory-policy allkeys-lru
它们的触发条件都是Redis使用的内存达到阈值时。
应用场景:但是需要注意,将key设置过期时间实际上会消耗更多的内存,因此我们建议使用allkeys-lru策略从而更有效率的使用内存。
volatile-lru策略和volatile-random策略适合我们将一个Redis实例既应用于缓存和又应用于持久化存储的时候。
allkeys-random:如果我们的应用对于缓存key的访问概率相等,则可以使用这个策略。

底层算法
LRU 全称是 Least Recently Used,即最近最少使用,会将最不常用的数据筛选出来,保留最近频繁使用的数据。
LRU 会把所有数据组成一个链表,链表头部称为 MRU,代表最近最常使用的数据;尾部称为 LRU代表最近最不常使用的数据;
LFU 全称 Least Frequently Used,即最不经常使用策略,它是基于数据访问次数来淘汰数据的,在 Redis 4.0 时添加进来。它在 LRU 策略基础上,为每个数据增加了一个计数器,来统计这个数据的访问次数。
参考文章

Redis的删除策略

Redis的每个Key都可以设置一个过期时间,当达到过期时间的时候,这个key就会被自动删除。这就是Redis的过期策略。

Redis使用懒惰删除+定期删除相结合的方式处理过期的key。

懒惰删除

所谓懒惰删除就是在客户端访问该key的时候,redis会对key的过期时间进行检查,如果过期了就立即删除。
优点:在访问的时候检查key的过期时间,不会占用太多的额外CPU资源。
缺点:如果一个key已经过期了,如果长时间没有被访问,那么这个key就会一直存留在内存之中,严重消耗了内存资源。

定期删除

Redis会将所有设置了过期时间的key放入一个字典中,然后默认每隔100ms从字典中随机一些key检查过期时间并删除已过期的key。在Redis2.8版本后,可以通过修改配置文件redis.conf 的 hz 选项来调整这个扫描的次数。
扫描的过程如下:
1、从过期字典中随机20个key
2、删除这20个key中已过期的
3、如果超过25%的key过期,则重复第一步
同时,为了保证不出现循环过度的情况,Redis还设置了扫描的时间上限,默认不会超过25ms。

  • Redis中同时使用了惰性过期和定期过期两种过期策略。

假设Redis当前存放30万个key,并且都设置了过期时间,如果你每隔100ms就去检查这全部的key,CPU负载会特别高,最后可能会挂掉。因此,redis采取的是定期过期,每隔100ms就随机抽取一定数量的key来检查和删除的。但是呢,最后可能会有很多已经过期的key没被删除。这时候,redis采用惰性删除。在你获取某个key的时候,redis会检查一下,这个key如果设置了过期时间并且已经过期了,此时就会删除。

  • 作者:北海冥鱼未眠
  • 原文链接:https://blog.csdn.net/qq_45401910/article/details/123771546
    更新时间:2022年9月25日12:15:55 ,共 1567 字。