首页天道酬勤redis的key过期后没有删除,redis设置过期时间的方法

redis的key过期后没有删除,redis设置过期时间的方法

张世龙 05-05 16:58 93次浏览

设定有效期限

EXPIRE命令将密钥key的生存时间设置为ttl秒

PEXPIRE命令用于将密钥key的生存时间设置为ttl毫秒

EXPIREAT命令用于将密钥key的生存时间设置为timestame中指定的秒数的时间戳

PEXPIREAT命令将密钥key的生存时间设置为timestame中指定的毫秒时间戳

实际上,无论客户端运行上述四个命令中的哪一个,最终运行的结果都与运行PEXPIREAT命令相同

image.png

保存密钥的有效期

redisDb结果的expires词典包含数据库中所有密钥的过期时间。 这本词典称为过期词典

过期词典中的键是指向键空间中的键对象的指针

过期字典的值是长整型证书,它保存毫秒精度的UNIX时间戳

image.png

image.png

过期密钥删除策略的三种方案

删除计时器:在设置密钥过期时间的同时,创建计时器,使计时器执行密钥删除操作

惯性删除:每次获取expires对象中的密钥是否过期时进行判断,如果已过期,则删除密钥,否则返回该密钥

定期删除:程序每隔一段时间遍历并检查数据库,删除过期密钥

定时删除

计划删除策略对内存最友好,通过使用计时器,计划删除策略确保密钥在过期时间内始终被删除,删除后释放该密钥使用的内存。 但是,计划删除策略的缺点是对CPU时间最不友好。 如果过期密钥较多,则删除过期密钥可能会占用相当大的CPU时间;如果内存不紧张,但CPU时间非常紧张,则错误的是将大量的CPU时间浪费在删除过期策略上,而不是处理客户端的请求

惯性删除

通过定时删除的记述,你可能觉得那个用惯性删除就最好了。 这样可以在不浪费CPU时间的情况下,每次提取数据时进行判断,到期后再删除,从而腾出大量的CPU来处理客户端的请求。 但是,这对内存来说是最不友好的。 之所以这么说,是因为这个策略并不能保证所有的密钥都可以访问。 例如,如果不经常检索的数据大量存储在内存中,而这些内存不释放,后果可能会多么严重。

定期删除

从上述两种情况来看,一次使用这两种删除方法的流程存在明显缺陷。

删除计划需要太长的CPU时间,这会影响服务器的响应时间和吞吐量。

惰性删除会浪费过多的内存,有内存泄漏的风险

定期战略是两种战略的折中方法。

定期在策略中执行删除过期的操作,并限制删除操作的执行时间和频率,从而减少删除操作对CPU时间的影响

定期删除过期密钥,可以有效减少过期密钥造成的内存浪费

但是,这个问题点是如何设定删除操作的执行时间和频率? 设定得太频繁了吧。 另外,和定时删除一样,浪费大量的CPU,延长设定吧。 此外,内存可能会大量累积。

Redis使用的过期删除策略

Redis实际上使用两种策略:惯性删除和定期删除,同时使用可以使服务器更好地平衡CPU和内存。

惯性删除策略的实现

每次获取数据时都会调用筛选器函数(db.c/expireIfNeeded )。 此函数主要用于确定密钥的过期时间,如果过期则删除密钥,否则检索相应密钥的值。

image.png

实现定期删除密钥的策略

过期密钥的定期删除策略通过Redis.c/activeExpireCycle函数实现,每当redis的服务器定期操作和运行redis.c/serverCron函数时,它都是activeExpireCycle函数

每次执行函数时,都会从一定数量的数据库中检索一定数量的随机密钥进行检查,并删除其中的过期密钥。

全局变量current_db记录当前activeExpireCycle函数检查的进度,并在下次调用activeExpireCycle时跟随上次进度进行处理。

当activeExpireCycle函数继续运行时,它将检查服务器中的所有数据库一次,最后将current_db设置为0,然后重新启动。

上述内容均请参考wrdxtg的《Redis设计与实现》

redis key过期回调,redis过期键的删除策略