Redis过期策略

使用Redis时,一般会设置一个过期时间,那么过期时间这个功能是怎么实现的呢?

三种过期策略:

1,定时删除

在设置key的过期时间的同时,为该key设置一个定时器,让定时器在key的过期时间到来的时候,对其进行删除,这种设置的优点是可以保证内存尽快释放,缺点是,当过期key比较多时,删除这些key会占用许多的CPU时间,在CPU时间紧张的时候,CPU不能把分出CPU时间来做最必要的事,此外需要花费时间删除key,并且定时器创建也需要一定的耗时,同时有许多定时器产生,对性能影响严重。

2,懒汉式删除

过期的时候不删除。每次通过key获取值的时候检查是否过期,若过期。则删除。这种策略的优点是只发生在取值的时候,而且只删除当前key,对CPU占用时间少,而且此时的key是不可不删除的。缺点就是大量的key在超出过期时间后,并且很久一段时间内没有被获取,那么久可能让许多垃圾占用了内存。

3,定期删除

每隔一段时间执行一次删除过期key的操作,通过限制删除的时长和频率,来减少删除操作对CPU时间的占用,然后处理“定时删除”的缺点,缺点是在内存友好方面没有定时删除友好,但是优于懒汉式,CPU时间友好方面,不如懒汉式,但是优于定时。

运用定期删除的难点在于设置合适的执行时长和执行频率,每次执行时间太长或者太长都是一种压力,并且每次进行删除之后,需要记录遍历循环到哪个标志位,以便下个定期时间来临时,从上个位置开始循环遍历。

Redis采用的过期策略

懒汉式+定期删除。

懒汉式:

在进行get和setnx的时候,先检查key是否火气,若过期,则删除。否则继续执行接下来的步骤。

定期:

对执行个数个库的每一个库随机删除一个删除小于等于指定个数个过期key,遍历每一个数据库(Redis.conf配置的database的大小),检查当前库中的指定个数的key,如果当前库没有一个key设置了过期时间,执行下一个库的遍历,随机获取当前一个设置过期时间的key,检查key是否过期,如果过期,删除key。判断定期删除是否达到指定时长,达到则退出定期删除。

对于定期删除,有一个current_db来记录下一个要遍历的库,假设有16个库,一次定期删除遍历是个,那么此时current_db就是11,下一次就是从第11个库开始遍历。如果等于current_db-1则之后遍历从0开始。

原文地址:https://www.cnblogs.com/Yintianhao/p/12335944.html