1 过期删除策略
定时删除
在设置某个key 的过期时间同时,我们创建一个定时器,让定时器在该过期时间到来时,立即执行对其进行删除的操作。
优点:定时删除对内存是最友好的,能够保存内存的key一旦过期就能立即从内存中删除。
缺点:对CPU最不友好,在过期键比较多的时候,删除过期键会占用一部分CPU时间,对服务器的响应时间和吞吐量造成影响。
定期删除
周期性的随机检查一批设置了过期时间的key并进行处理,检查到的已过期的key将被删除。
优点:可以通过限制删除操作执行的时长和频率来减少删除操作对CPU的影响。另外定期删除,也能有效释放过期键占用的内存
缺点︰难以确定删除操作执行的时长和频率。如果执行的太频繁,定期删除策略变得和定时删除策略一样,对CPU不友好。如果执行的太少,那又和惰性删除一样了,过期键占用的内存不会及时得到释放。
另外最重要的是,在获取某个键时,如果某个键的过期时间已经到了,但是还没执行定期删除,那么就会返回这键的值,这是业务不能忍受的错误。
惰性删除
不会去主动删除数据,而是在访问数据的时候,再检查当前键值是否过期,如果过期则执行删除并返回null给客户端,如果没有过期则返回正常信息给客户端。
优点:对CPU友好,我们只会在使用该键时才会进行过期检查,对于很多用不到的key不用浪费时间进行过期检查。
缺点:对内存不友好,如果一个键已经过期,但是一直没有使用,那么该键就会一直存在内存中,如果数据库中有很多这种使用不到的过期键,这些键便永远不会被删除,内存永远不会释放。从而造成内存泄漏。
Redis默认使用的过期删除策略
Redis 默认使用的是惰性删除和定期删除混合使用。这意味着当客户端尝试读取一个键时,Redis 会先检查该键是否过期,如果过期则会立即删除。这种策略保证了过期键在被访问时能够及时被清理,但也会带来一定的性能开销,因为每次读取键时都需要进行过期检查。
而且,Redis还会周期性地(默认每秒钟检查10次)在后台进行定期删除(Eviction)。定期删除主要用于处理那些没有被惰性删除的过期键。定期删除会检查一部分设置了过期时间的键,然后删除其中已经过期的键。
总结:查出来发现过期了才会给他删除,redis还会在后台定期删除(每10s检查一次)部分设置过期时间的键。
2 内存淘汰策略
内存空间有限,满了怎么办?Redis默认使用的是LRU算法。