Redis定期删除策略工作原理
- 随机抽查:Redis并非对所有设置了过期时间的键进行逐一检查是否过期,而是随机从设置了过期时间的键空间中挑选一定数量的键。
- 判定删除:对挑选出的键,检查其是否过期,如果过期则删除该键。
- 定期执行:这个抽查删除操作是定期执行的,执行周期由配置文件中的
hz
参数控制,hz
表示每秒执行的次数,默认值为10,即每秒执行10次。
缓存业务场景下的应用
- 平衡内存占用和CPU消耗:
- 内存占用:如果不进行定期删除,随着时间推移,大量过期的缓存数据会一直占用内存,导致内存占用过高,甚至可能引发内存溢出等问题。定期删除策略能及时清理过期数据,从而控制内存占用。
- CPU消耗:如果检查频率过高,每次检查的键过多,会大量消耗CPU资源,影响Redis处理其他命令的性能。Redis采用随机抽查少量键的方式,既不会让过期数据长时间占用内存,又不会过度消耗CPU。
- 举例:
假设我们有一个电商网站的商品详情缓存业务场景。每个商品的详情在缓存中设置了1小时的过期时间。
import redis
r = redis.Redis(host='localhost', port=6379, db = 0)
product_id = "12345"
product_detail = "商品详细信息"
r.setex(product_id, 3600, product_detail) # 设置商品详情缓存,过期时间3600秒(1小时)
- 定期删除过程:Redis后台每秒会按照
hz
(默认10次)的频率,从所有设置了过期时间的键(包括我们这个商品详情键)中随机抽取一部分键进行检查。如果抽到了这个商品详情键且它已过期,就会将其删除。这样既不会因为一直保留过期的商品详情缓存而占用过多内存,也不会因为频繁检查所有键而大量消耗CPU,实现了内存占用和CPU消耗的平衡。