通常删除某个key,我们有如下三种方式进行处理.
1.定时删除
在设置某个key的过期时间同时,我们创建一个定时器,让定时器在该过期时间到来时,立即执行对其进行删除的操作.
优点:
-
定时删除对内存是最友好的,能够保存内存的key一旦过期就能立即从内存中删除.
缺点:
-
对CPU最不友好,在过期键比较多的时候,删除过期键会占用一部分CPU时间,对服务器的响应时间和吞吐量造成影响.
2.惰性删除
设置该key过期时间后,我们不去管它,当需要该key时,我们在检查其是否过期,如果过期,我们就删掉它,反之返回该key.
优点:
-
对CPU友好,我们只会在使用该键时才会进行过期检查,对于很多用不到的key不用浪费时间进行过期检查.
缺点:
-
对内存不友好,如果一个键已经过期,但是一直没有使用,那么该键就会一直存在内存中,如果数据库中有很多这种使用不到的过期键,这些键便永远不会被删除,内存永远不会释放.从而造成内存泄漏.
3.定期删除
每隔一段时间,我们就对一些key进行检查,删除里面过期的key.
优点:可以通过限制删除操作执行的时长和频率来减少删除操作对CPU的影响.另外定期删除,也能有效释放过期键占用的内存.
缺点:
-
难以确定删除操作执行合适的时长和频率.
-
如果执行的太频繁,定期删除策略变得和定时删除策略一样,对CPU不友好.
-
如果执行的太少,那又和惰性删除一样了,过期键占用的内存不会及时得到释放.
-
另外最重要的是,在获取某个键时,如果某个键的过期时间已经到了,但是还没执行定期删除,那么就会返回这个键的值,这是业务不能忍受的错误.