Redis的过期策略
1. 惰性删除(Lazy expiration)
- 当客户端尝试访问某个键时,Redis会先检查该键是否设置了过期时间,并判断是否过期。
- 如果键已过期,则Redis会立即将其删除。这就是惰性删除策略。
该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。
2. 定期删除(Active expiration)
- Redis会每隔一段时间(默认100毫秒)随机检查一部分设置了过期时间的键。
- 定期过期策略通过使用循环遍历方式,逐个检查键是否过期,并删除已过期的键值对。
通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果
Redis中同时使用了惰性过期和定期过期两种过期策略。
- 假设Redis当前存放20万个key,并且都设置了过期时间,如果你每隔100ms就去检查这全部的key,CPU负载会特别高,最后可能会挂掉。
- 因此redis采取的是定期过期,每隔100ms就随机抽取一定数量的key来检查和删除的。
- 但是呢,最后可能会有很多已经过期的key没被删除。这时候,redis采用惰性删除。在你获取某个key的时候,redis会检查一下,这个key如果设置了过期时间并且已经过期了,此时就会删除。
需要注意如果定期删除漏掉了很多过期的key,然后也没走惰性删除。就会有很多过期key积在内存中,可能会导致内存溢出,或者是业务量太大,内存不够用然后溢出了,为了应对这个问题,Redis引入了内存淘汰策略进行优化。
Redis采用惰性删除和定期删除相结合的过期策略,以节省CPU资源。定期删除通过定时抽查部分过期键,而惰性删除在访问时检查并删除。若定期删除导致内存问题,Redis通过内存淘汰策略来优化内存使用。
459

被折叠的 条评论
为什么被折叠?



