Redis过期策略包括定时任务删除和惰性删除。

在Sentinel模式下,从库不会进行过期扫描,主库key过期后,会在AOF文件里面新增一条del指令,当AOF文件同步到所有从库时,从库才执行这条del语句来删除过期的key。AOF同步是异步进行的,所以可能会出现数据不一致的情况。

redis移除过期时间 redis如何删除过期数据_redis删除过期key的算法

Redis内存淘汰策略

Redis之所以吞吐率高,很大一个原因就是在内存中进行的操作,当Redis超出物理内存限制时,Redis就会频繁的在内存和磁盘中交换数据,交换数据会让Redis的性能极速下降。所以,为了限制使用的最大内存,Redis提供了maxmemory参数来限制内存大小。当内存超出maxmemory时,Redis提供了几种策略来释放新的内存,以便Redis能继续对外提供读写服务

redis移除过期时间 redis如何删除过期数据_redis删除过期key的算法_02

从图片可以看出,allkeys-开头的策略是针对多有的key

LRU算法

普通LRU算法很简单,就是一个链表就可以解决,每次访问一个值,就把这个值移到链表的头部,需要淘汰的时候,就移除链表最后一个值就可以了。

Redis的近似LRU算法

Redis实现LRU算法,除了维护key/value外,还需要单独维护一个链表,或者每个key再存储两个指针。

根据Redis作者的说法,每个Redis Object可以挤出24 bits的空间,但24 bits是不够存储两个指针的,而存储一个低位时间戳是足够的这是一个非常占用内存的方式。所以Redis采用的是方法是在每个key增加了一个长度为24bit的字段,来存储这个key最近一次的访问时间戳。

文章最开始提到的过期key淘汰策略有定时任务和惰性删除。这里,LRU淘汰只采用了惰性处理,当Redis执行写操作,发现Redis内存超出maxmemory时,就会执行一次LRU淘汰算法。算法步骤时每次随机选择5个key,然后淘汰最旧的那个key,重复此步骤,知道内存低于maxmemory为止。

从Redis 3.0之后有改善了这个算法的性能。3.0之后不再是从所有的key池里面随机抽选5个key,而是会提供一个待淘汰、大小为16的key pool,pool里面的key是按空闲时间排好序了,每次都是淘汰空闲时间最久的那个key

redis移除过期时间 redis如何删除过期数据_链表_03