Redis 中有个设置时间过期的功能,即对存储在 redis 数据库中的值可以设置一个过期时间。
作为一个缓存数据库,这是非常实用的。
比如,一般项目中的 Token 或是 Cookie 信息,尤其是短信验证码,都是有时间限制的,按照传统的数据库处理方式,一般都是自己判断过期,这样无疑会严重影响项目性能。
我们 set key 的时候,都可以给一个 expire time,也就是过期时间,这样就指定了这个 key 可以存活的时间。
假设我们设置了一批只能存活1个小时的 key,那么1小时后,redis 是怎么对这批 key 进行删除的?
答案是:定期删除 + 惰性删除
- 定期删除:redis 默认每隔 100ms 就 随机抽取 那些设置了过期时间的 key,检查其是否过期,如果过期,就删除。注意,这里是随机抽取的。为什么要随机呢?想想,假如 redis 存了几十万个 key ,每隔 100ms 就遍历所有设置了过期时间的 key 的话,会给 CPU 带来很大的压力
- 惰性删除 :定期删除可能会导致很多过期的 key 到了时间并没有被删除掉,所以就有了惰性删除。假如过期 key,靠定期删除没有被删除掉,还缓存在内存里,此时当程序去查那个 key 时,redis 如果判断过期,就会给删除掉,这就是所谓的惰性删除