过期键的删除策略

171 阅读2分钟

这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战

过期键的删除策略

定时删除

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

定时删除在过期键较多的时候,删除过期键会占用一部分CPU时间,对服务器的响应时间和吞吐量造成影响。

惰性删除

每次从键空间中获取键时,检查取得的键是否过期,如果过期,就删除该键,如果没有过期,返回该键

惰性删除对CPU时间来说最友好,程序只会在取出键时才对键进行过期检查,保证删除过期键的操作是必要的,并且删除的目标仅限于当前键,不会在删除其他无关键上话费CPU时间。

惰性删除的问题:

对内存不友好:如果一个键已经过期了,这个键仍然保留在数据库中,那么只要这个过期键不被删除,它所占用的内存就不会释放。

如果数据库中很多过期键,这些过期键又恰好没有访问到,它们永远不会被删除,这就会出现内存泄露:无用的垃圾数据占用大量内存,而服务器不会自己释放。

定期删除

每隔一段时间,程序对数据库进行一次检查,删除里面的过期键。

定时删除占用太多CPU时间,影响服务器的响应时间和吞吐量。惰性删除浪费太多内存,有内存泄露风险。

定期删除策略每隔一段时间执行一次删除过期键操作,并通过限制删除操作执行的时长和频率减少删除操作对CPU时间的影响。定期删除策略能有效减少因为过期键带来的内存浪费。

定期删除策略难点是确定删除操作执行的时长和频率,如果删除操作执行太频繁,定期删除策略就会退化成定时删除策略,以至于CPU时间过多消耗在删除过期键上面,如果删除操作执行太少,定期删除和惰性删除一样,浪费内存。