我们都知道,Redis的Key是可以设置过期时间的,那么,过期了一定会立即删除吗?
回答这个问题之前,我们先看下Redis是如何实现的Key的过期。
以下是官网中关于过期的实现的描述(https://redis.io/commands/expire/ ):
也就是说Redis的键有两种过期方式:一种是被动过期,另一种是主动过期。
被动过期指的是当某个客户端尝试访问一个键,发现该键已经超时,那么它会被从Redis中删除。
当然,仅仅依靠被动过期还不够,因为有些过期的键可能永远不会再被访问。这些键应该被及时删除,因此Redis会定期随机检查一些带有过期时间的键。所有已经过期的键都会从键空间中删除。
具体来说,Redis每秒会执行以下操作10次:
直到过期Key的比例下降到 25% 或者这次任务的执行耗时超过了25毫秒,才会退出循环
所以,Redis其实是并不保证Key在过期的时候就能被立即删除的。因为一方面惰性删除中需要下次访问才会删除,即使是主动删除,也是通过轮询的方式来实现的。如果要过期的key很多的话,就会带来延迟的情况。
主动删除的优点:
主动删除的缺点:
被动删除的优点:
被动删除的缺点:
Redis的被动删除策略,不需要额外配置。当你设置键的过期时间(TTL)时,Redis会自动处理被动删除。
要使用主动删除策略,需要在Redis配置文件中设置过期键检查的频率。你可以通过设置以下配置参数来调整主动删除的行为:
例如,在Redis配置文件中可以设置:
maxmemory 1gb
hz 10