Redis过期

199 阅读3分钟

过期策略

Redis会将每个设置了过期时间对key放入一个独立对字典中,以后会定时遍历这个字典来删除到期对key。或者使用懒惰策略来删除过期对key(在客户端访问这个key的时候,Redis对key的过期时间进行检查,如果过期就立即删除)

Redis默认每秒进行10次过期扫描,但是不会遍历过期字典中的所有的key

策略:

1、从过期字典中随机选出20个key

2、删除这20个key中已经过期的key

3、如果过期的key的比例超过1/4,那么就重复步骤1

为了保证过期扫描不会出现循环过度,导致线程卡死的现象,算法还增加了扫描时间的上限,默认不超过25ms

从节点的过期策略

从节点不会进行过期扫描,它对过期的处理是被动的,主节点在key到期时,会在AOF文件里增加一条del指令,同步到所有的从节点,从节点通过执行这条del指令来删除过期的key。

因为主从节点是异步同步的所以会造成主从之间的数据不一致的问题

LRU

当Redis的内存超出物理内存限制时,内存的数据会开始和磁盘产生频繁的交换,让Redis的性能急剧下降。

Redis提供参数maxmemory来限制内存超出期望大小

当实际内存超出maxmemory时,Redis提供了几种可选策略来让用户自己决定该如何腾出新的空间以继续提供服务。

1、noeviction:不继续提供写服务(del可以)读请求可以。这样保证不会丢失数据,但是会让线上的业务不能继续进行,这是默认的淘汰策略。

2、volatile-lru:尝试淘汰设置了过期时间的key,最少使用的key优先被淘汰。没有设置过期时间的key不会被淘汰,保证了需要持久化的数据不会突然丢失。

3、volatile-ttl:尝试淘汰设置了过期时间的key,比较key的剩余寿命ttl的值,ttl越小越优先被淘汰。

4、volatile-random:尝试淘汰设置了过期时间的key,淘汰的key是过期key集合中的随机key

5、allkeys-lru:淘汰全体key中最少使用的key

6、allkeys-random:淘汰全体key中的随机key

近似LRU算法

在现有数据结构的基础上使用随机采样法来淘汰元素达到和LRU算法近似的效果

Redis给每个key增加了一个额外的小字段,这个字段的长度为24bit,就是最后一次被访问的时间戳

当Redis执行写操作时,发现内存超出maxmemory就会执行一次LRU淘汰算法:随机采样出5(数量可以设置)个key,淘汰掉最旧的key,如果淘汰后的内存还是超出maxmemory,那就继续淘汰直到内存低于maxmemory为止。

Redis在3.0增加了淘汰池,它是一个数组,大小为maxmemory_samples,在每一次淘汰循环中,新的随机得出的key列表会和淘汰池中的key列表进行融合,淘汰掉最旧的一个key之后,保留剩余较旧的key列表放入淘汰池中留待下一个循环。


                                                        欢迎关注公众号