Redis 过期策略和内存淘汰机制

Redis过期策略和内存淘汰机制




1、Redis数据为什么会过期

首先,要明白redis是用来做数据缓存的,不是用来做数据存储的(当然也可以当数据库用)。
数据过期主要是有两种情况:

(1)在设置缓存数据时制定了过期时间,这样到了过期时间数据就不见了。

(2)redis的数据是存放在内存中的,而内存是有限的,是不可能放过多数据的,比如只有10G的内存,想要向里面放入12G的数据, 那么就注定会有2G的数据会丢失。



2、redis的过期策略

redis 的过期策略是:定期删除 + 惰性删除

(1)定期删除

定期删除指的是redis默认每隔100ms就随机抽取一些设置了过期时间的key,检测这些key是否过期,如果过期了就将其删掉。

问题】为什么会选择一部分,而不是全部:
因为如果这是redis里面有大量的key都设置了过期时间,那么如果全部去检测一遍,CPU负载就会很高,会浪费大量的时间在检测上面,甚至直接导致redis挂掉。所有只会抽取一部分而不会全部检查。

出现的问题
这样的话就会出现大量的已经过期的key并没有被删除,这就是 为什么有时候大量的key明明已经过了失效时间,但是redis的内存还是被大量占用的原因 ,为了解决这个问题,就需要惰性删除这个策略了

(2)惰性删除

惰性删除不在是redis去主动删除,而是在你要获取某个key 的时候,redis会先去检测一下这个key是否已经过期,如果没有过期则返回给你,如果已经过期了,那么redis会删除这个key,不会返回给你。

出现的问题
这样两种策略就保证了 过期的key最终一定会被删除掉 ,但是这只是保证了最终一定会被删除,要是定时删除漏掉了大量过期的key,而且我们也没有及时的去访问这些key,那么这些key不就不会被删除了吗?不就会一直占着我们的内存吗?这样不还是会导致redis内存耗尽吗?
由于存在这样的问题,所以redis引入了 内存淘汰机制 来解决



3、内存淘汰机制

内存淘汰机制就是为保证了在redis的内存占用过多的时候,去进行内存淘汰,也就是删除一部分key,保证redis的内存占用率不会过高。

redis.conf中有一行配置可以设置内存淘汰机制

maxmemory-policy volatile-lru   //内存淘汰机制为volatile-lru

redis提供了6中内存淘汰策略,我们可以去进行选择,六中策略如下:

策略 作用
noeviction 当内存不足以容纳新写入数据时,新写入操作会报错,无法写入新数据,一般不采用
allkeys-lru 当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key,这个是最常用的
allkeys-random 当内存不足以容纳新写入的数据时,在键空间中,随机移除key,一般也不使用。
volatile-lru volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key(这个一般不太合适) 。
volatile-random 当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key 。
volatile-ttl 当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。

注意:
如果没有设置 expire 的key(即没有设置过期时间), 不满足先决条件(prerequisites); 那么 volatile-lru, volatile-random 和 volatile-ttl 策略的行为, 和 noeviction(不删除) 基本上一致



4、其他模块对过期键的处理

(1)生成RDB文件时
执行 SAVE 或 BGSAVE 时 ,数据库键空间中的过期键不会被保存在RDB文件中

(2)载入RDB文件时
Master 载入RDB时,文件中的未过期的键会被正常载入,过期键则会被忽略
Slave 载入 RDB 时,文件中的所有键都会被载入,当同步进行时,会和Master 保持一致。

(3)AOF 文件写入时
数据库键空间的过期键的过期但并未被删除释放的状态会被正常记录到 AOF 文件中当过期键发生释放删除时,DEL 也会被同步到 AOF 文件中去

(4)重新生成 AOF文件时
执行 BGREWRITEAOF (重写)时 ,数据库键中过期的键不会被记录到 AOF 文件中

(5)主从复制时
Master 删除 过期 Key 之后,会向所有 Slave 服务器发送一个 DEL命令,从服务器收到之后,会删除这些 Key
Slave 在被动的读取过期键时,不会做出操作,而是继续返回该键,只有当Master 发送 DEL 通知来,才会删除过期键,这是统一、中心化的键删除策略,保证主从服务器的数据一致性。


发布了78 篇原创文章 · 获赞 53 · 访问量 8169

猜你喜欢

转载自blog.csdn.net/qqq3117004957/article/details/104821245