redis学习程序员缓存架构

Redis过期键删除策略

2017-11-19  本文已影响53人  youngiii

设置过期时间

保存键过期时间

redisDb 结果的 expires 字典保存了数据库中所有键的过期时间,我们称这个字典为过期字典

image.png

过期键删除策略的三种方案

定时删除

定时删除策略对内存最友好,通过使用定时器,定时删除策略可以保证键在过期时间一定会被删除,删除后就释放该键之前占用的内存。但是,定时删除策略的缺点是,它对 CPU 时间是最不友好的,在过期键比较多的情况下,删除过期键这一行为可能会占用相当一部分 CPU 时间,在内存不紧张但是 CPU 时间非常紧张的情况下,将大量 CPU 时间浪费在删除过期的策略上,而不是用在处理客户端的请求上,毫无疑问是不行的。

惰性删除

通过定时删除的描述,你可能会想那用惰性删除就最好了,这样就不会浪费 CPU 时间,每次取数据的时候才判断,如果过期才删除它,这样就能腾出大量的 CPU 去处理客户端请求了。然而,这对内存却又是最不友好的,因为这种策略并不能保证所有键一定会访问到,比如说一些取得并不频繁的数据,就会大量堆积在内存中,如果这些内存得不到释放,可想而知后果是多么严重。

定期删除

从上面两种情况看来,这两种删除的方式单一使用的过程都有明显的缺陷:

Redis所使用的过期删除策略

Redis实际上使用的是惰性删除和定期删除两种策略,通过配合使用,服务器可以很好的平衡 CPU 和内存。

定期删除键的策略实现

过期键的定期删除策略由 redis.c/activeExpireCycle函数实现,每当 Redis 的服务器周期性操作 redis.c/serverCron 函数执行时, activeExpireCycle 函数就会被调用,它在规定的时间内分多次遍历服务器的各个数据库,检查数据库的 expires 字典中部分键(相当于分页查询)的过期时间,并删除它。步骤如下:

以上内容均参考 黄健宏的《Redis设计与实现》

上一篇下一篇

猜你喜欢

热点阅读