键的过期策略

整理自《Redis设计与实现》

Posted by     "Eric" on Friday, September 11, 2020

1. 设置键的生存时间或过期时间

在Redis中,可以对任意键设置一个生存时间,有以下四个命令,他们之间的关系如下,其中以P开头的表明时间单位为毫秒;以AT结尾的表名在timestamp时刻过期。不管是执行这四个之中的何种命令,最终都会转化成PEXPIREAT这条命令执行,然后在redistDb结构中,会用一个expires字典保存数据库中所有键的过期时间。

image-20200911143539544

通过过期字典,程序可以用以下步骤检查一个给定键是否过期:

  1. 检查给定键是否存在于过期字典:如果存在,那么取得过期键的过期时间
  2. 检查当前UNIX时间戳是否大于键的过期时间:如果是的话,那么键已经过期;否则的话,键未过期。

image-20200911143938124

2. 过期键的删除策略

Redis服务器使用了惰性删除和定期删除两种策略;所谓的惰性删除就是在访问该键时才检查键是否过期。定期删除每隔一段时间执行一次删除过期键的操作。

过期键的惰性删除策略由db.c/expireIfNeeded函数实现,所有读写数据库的Redis命令在执行之前都会调用expireIfNeeded函数对输入键进行检查

image-20200912144612800

过期键的定期删除策略由redis.c/activeExpireCycle函数实现,每当Redis的服务器周期性操作redis.c/serverCron函数执行时,activeExpireCycle函数就会被调用,它在规定的时间内,分多次遍历服务器中的各个数据库。