阅读 30

Redis过期键删除策略

如果Redis中的一个键过期了,那么它什么时候会被删除呢?

一般会有三种不同的删除策略:

定时删除:

在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时间来临时,立即执行对键的删除操作

定时删除策略对内存是最友好的:通过使用定时器,定时删除策略可以保证过期键会尽可能地被删除,并释放过期键所占用的内存。另一方面,对CPU时间最不友好。

惰性删除:

放任键过期时间不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话就删除该键,否则返回该键。

程序只会在取出键时才对键进行过期检查,这可以保证删除过期键的操作只会在非做不可的情况下进行。对内存不友好,对CPU友好。

定期删除:

每隔一段时间,程序就对数据库进行一次检查,删除里面的过期键。至于要删除多少个过期键,以及要检查多少个数据库,则有算法决定

每隔一段时间执行一次删除过期键操作,并通过限制删除操作执行的时长和频率来减少删除操作对CPU时间的影响。

Redis的过期键删除策略:

Redis服务器实际使用的是惰性删除和定期删除两种策略,通过配合使用这两种删除策略,服务器可以很好地在合理使用CPU时间和避免浪费内存之间取得平衡

惰性删除策略的实现:

过期键的惰性删除策略有db.c/expireIfNeeded函数实现,所有读写数据库的Redis命令在执行之前都会调用expireIfNeeded函数对输入键进行检查

如果输入键已经过期,那么expireIfNeeded函数将输入键从数据库中删除。

如果输入键未过期,那么expireINeeded函数不做动作。

定期删除策略的实现:

过期键的定期删除策略由redis.c/activeExpireCycle函数实现,每当Redis的服务器周期性操作redis.c/serverCron函数执行时,activeExpirecycle函数就会被调用,它在规定的时间内,分多次遍历服务器中的各个数据库,从数据库的expires字典中随机检查一部分键的过期时间,并删除其中的过期键

Ref:

《Redis设计与实现》——黄健宏

文章分类
后端
文章标签