Redis失效时间设置和内存淘汰机制

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

一.Redis过期键删除策略

1.过期键删除策略

A.定时删除

设置键的过期时间时,创建一个 Timer ,当过期时间到临时,立刻删除键。
内存友好型策略,一旦键过期,就会被删除,并释放所占用的内存,Cpu 不友好,当一批数量比较多的键过期时,正好遇上Cpu 紧张的时段,这时候需要的是Cpu处理能力,而不是内存,显然 Cpu 时间用在删除过期键上,会对服务器的响应时间和吞吐量造成影响。另外当前 Redis 时间事件(无序链表O(N))无法高效处理大量时间事件,所以定时删除并不是一种好的定时删除策略。

B.惰性删除

不管过期的键,在这种策略下,当键在键空间中被取出时,首先检查取出的键是否过期,若过期删除该键,否则,返回该键。
很明显,惰性删除依赖过期键的被动访问,对于内存不友好,如果一些键长期没有被访问,会造成内存泄露(垃圾数据占用内存)。我们知道,Redis是依赖内存的,所以惰性删除也不是一个好的策略。

C.定期删除

由定时删除算法,定期的去检查一定的数据库,删除一定的过期键。
通过合理的删除操作执行的时长和频率,达到合理的删除过期键。

2.其他问题

A.Redis采用策略和原因

其实,redis采用的是定期删除+惰性删除策略。

B.为什么不用定时删除策略?

定时删除,用一个定时器来负责监视key,过期则自动删除。虽然内存及时释放,但是十分消耗CPU资源。在大并发请求下,CPU要将时间应用在处理请求,而不是删除key,因此没有采用这一策略.

C.定期删除+惰性删除是如何工作的呢?

定期删除,redis默认每个100ms检查,是否有过期的key,有过期key则删除。需要说明的是,redis不是每个100ms将所有的key检查一次,而是随机抽取进行检查(如果每隔100ms,全部key进行检查,redis岂不是卡死)。因此,如果只采用定期删除策略,会导致很多key到时间没有删除。
于是,惰性删除派上用场。也就是说在你获取某个key的时候,redis会检查一下,这个key如果设置了过期时间那么是否过期了?如果过期了此时就会删除。

D.采用定期删除+惰性删除就没其他问题了么?

不是的,如果定期删除没删除key。然后你也没即时去请求key,也就是说惰性删除也没生效。这样,redis的内存会越来越高。那么就应该采用内存淘汰机制。

二.Redis内存淘汰机制

image.png

三.其他模块对淘汰键的处理

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 通知来,才会删除过期键,这是统一、中心化的键删除策略,保证主从服务器的数据一致性。

你可能感兴趣的:(Redis失效时间设置和内存淘汰机制)