Redis 过期字典与删除策略

2019-02-06  本文已影响19人  杰哥长得帅

redisDB 结构的 expires 字典保存了数据库中所有键的过期时间,该字典被称为过期字典

过期字典

在实际中,键空间的键和过期字典的键都指向同一个键对象,所以不会出现任何重复对象,也不会浪费任何空间

过期键删除策略

几种可选的删除策略:

定时删除

定时删除策略对内存是最友好的:通过定时器,定时删除策略可以保证过期键会尽快被删除,并释放过期键所占用的内存

另一方面,定时删除策略的缺点是,它对 CPU 时间不友好:在过期键比较多的情况下,删除过期键可能会占用相当一部分 CPU 时间,在内存不紧张但 CPU 时间紧张的情况下,将 CPU 时间用于删除和当前任务无关的过期键上,无疑会对服务器的响应时间和吞吐量造成影响

此外,创建一个定时器需要用到 Redis 服务器中的时间事件,而当前时间事件的实现方式为无序链表,查找一个事件的时间为 O(N),并不能高效地处理大量时间事件

惰性删除

惰性删除策略对 CPU 时间最友好:程序只会在取出键时才对键进行过期检查,这可以保证删除过期键的操作只会在非做不可的情况下进行,并且删除的目标仅限于当前处理的键,这个策略不会在删除其他无关的过期键上花费任何 CPU 时间

惰性删除的缺点是,它对内存是最不友好的:如果一个键已经过期,而这个键又仍然保留在数据库中,那么只要这个过期键不被删除,它所占用的内存就不会释放,这可以看作是一种内存泄漏

定期删除

定期删除策略是前两种策略的一种折中:

定期删除策略的难点是确定删除操作执行的时长和频率:

Redis 的过期键删除策略

Redis 实际使用的是惰性删除和定期删除两种策略,以求在合理使用 CPU 时间和避免内存浪费之间取得平衡

惰性删除实现

定期删除实现

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

上一篇 下一篇

猜你喜欢

热点阅读