过期删除策略

5 分钟阅读 776 字 + 492 词
image-20240924110647379
当我们对一个key设置了过期时间,Redis会把该key带上过期时间存储到一个 过期字典 中,也就是说== 过期字典保存了数据中所有key的过期时间 ==
当我们查询一个key时候, Redis首先检查该key是否存在于过期字典中:
1.如果不在 ,则正常读取键值
2.如果存在,则会获取该key的过期时间,然后与当前系统时间进行对比,如果比系统时间大,那就没过期。
三种过期删除策略
· ==定时删除== :在设置 key 的过期时间时,同时创建一个 定时事件 ,当时间到达时,由事件处理器自动执行 key 的删除操作。
优点 :可以保证过期 key 会被尽快删除,也就是内存可以被尽快地释放。因此, 定时删除对内存是最友好的
缺点 :在过期 key 比较多的情况下, 删除过期 key 可能会占用相当一部分 CPU 时间 ,在内存不紧张但 CPU 时间紧张的情况下,将 CPU 时间用于删除和当前任务无关的过期键上,无疑会对服务器的响应时间和吞吐量造成影响。所以,定时删除策略对 CPU 不友好。
· ==惰性删除== :如果过期不主动删除过期键, 每次从数据库访问 key 时,都检测 key 是否过期,则删除该 key。
​ 优点:因为每次访问时,才会检查 key 是否过期,所以此策略只会使用很少的系统资源,因此**,惰性删除策略对 CPU 时间最友好。**
​ 缺点:如果一个 key 已经过期,而这个 key 又仍然保留在数据库中,那么只要这个过期 key 一直没有被访问,**它所占用的内存就不会释放,造成了一定的内存空间浪费。**所以, 惰性删除策略对内存不友好
· ==定期删除== :每隔一段时间**「随机」 从数据库中 取出一定数量的 key 进行检查,并删除其中的过期key。**
​ 优点:通过限制删除操作执行的时长和频率,来减少删除操作对 CPU 的影响,同时也能删除一部分过期的数据减少了过期键对空间的无效占用。
​ 缺点:内存清理方面没有定时删除效果好,同时没有惰性删除使用的系统资源少, 难以确定删除操作执行的时长和频率 如果执行的太频繁,定期删除策略变得和定时删除策略一样,对CPU不友好:如果执行的太少,那又和惰性删除一样了,过期 key 占用的内存不会及时得到释放。
Redis使用 惰性删除+定期删除
redis的定期删除的流程:
数据库中随机抽取20个key ,检查这20个key是否过期,并 删除已过期的key ,如果 检查的过期key数量超过了5个 ,那么 就继续抽查 ,如果没有等待下一轮定期删除。循环流程有个上限不超过25ms