前言

    Redis可以通过expire/pexpire给每个Key设置不同的生存时间,超时到期后,Key将自动删除。

    只有删除覆盖等相关命令才能清除这个超时设置,如:delset。当然,也可以通过persist命令移除Key的expire设置,将Key重新设置为永久有效。

    Redis还提供了rename命令,可以将Key修改为其他名称,不过,这个操作仍然不会影响expire的设置。

过期信息的存储

    Key过期信息是存储的Unix绝对时间戳(版本>=2.6以毫秒为单位),
所以,过期时间的值与Redis服务是否在运行没有直接关系,与机器的系统时间有的直接关系,因为时间不会因为服务停止而停止向前。

    这个机制也存在一个问题,如果你迁移RDB文件到其他的服务器上,而这两台服务器的系统时间相差较大,那么就会导致Key提前到期,或延迟到期。

过期密钥的方式

Redis的Key有两种过期方式:

  • 被动方式
  • 主动方式

触发过期的时机

1,被动方式:

    仅当客户端尝试访问Key时,Key才会检测失效时间,从而被动失效。

2,主动方式:

    因为有的Key可能永远不会再次访问,所以被动方式显然不能满足。

    因此Redis会定期对具有设置了expire的Key,进行随机的检测,检测到失效,就直接删除失效Key。

具体实现逻辑:

1
2
3
4
Redis 每秒执行10次 的随机检测操作:
1,从一组设置了过期的密钥中随机选择20个Key
2,删除其中已经达到过期时间的Key
3,如果这一组key中有超过25%的密钥已过期,那么再次从`步骤1`开始执行

注:这个实现逻辑是一个概率算法,它假设我们随机取的这一组样本,可以代表整个Redis空间,持续不断的检测,直到可能过期的Key所占百分比低于25%。