Redis-过期实现策略

redis有个功能是可以给key设置一个超时时间,超时时间过后,会自动删除该key。

下面讨论一下该功能的实现策略。

分析如下:

第一种:懒汉式,即每次操作该key时,监测是否超过超时时间,如果超过则删除,并返回null。

若存在大量key超过过期时间,但是系统没有操作该key,会造成资源浪费

第二种:定时器,创建key设置过期时间后,创建一个定时器,定时器到达时间后,触发删除。

每个key都创建定时器,key多的情况下浪费资源

第三种:定期,每隔一段时间,检查redis中的key哪些已经过去,如果存在过期的key,则删除。

和前两种比,各有不足,难点在于时间频率,以及每次操作多长时间。

redis目前采用的是 饿汉式+定期的组合策略

1)在进行get或setnx等操作时,先检查key是否过期;
2)若过期,删除key,然后执行相应操作;
3)若没过期,直接执行相应操作;
4)定期删除流程(简单而言,对指定个数个库的每一个库随机删除小于等于指定个数个过期key):
5)遍历每个数据库(就是redis.conf中配置的”database”数量,默认为16)
6)检查当前库中的指定个数个key(默认是每个库检查20个key,注意相当于该循环执行20次,循环体是下边的描述)
7)如果当前库中没有一个key设置了过期时间,直接执行下一个库的遍历
8)随机获取一个设置了过期时间的key,检查该key是否过期,如果过期,删除key
9)判断定期删除操作是否已经达到指定时长,若已经达到,直接退出定期删除。

对于定期删除,在程序中有一个全局变量current_db来记录下一个将要遍历的库,假设有16个库,我们这一次定期删除遍历了10个,那此时的current_db就是11,下一次定期删除就从第11个库开始遍历,假设current_db等于15了,那么之后遍历就再从0号库开始(此时current_db==0)

转自:https://www.cnblogs.com/linuxprobe-sarah/p/10386800.html

猜你喜欢

转载自www.cnblogs.com/kinglovelqn/p/11962909.html