Redis(六)——过期删除策略

1.设置过期时间

redis可以通过4种指令设置键的生存时间

  • expire key seconds 设置多少秒过期
  • pexpire key milliseconds 设置多少毫秒过期
  • expireat key timestamp 设置过期的秒时间戳
  • pexpireat key timestamp 设置过期的毫秒时间戳

无论单位如何,最后都是转换成pexpireat命令来实现过期

2.记录

expires过期字典保存了所有键的过期时间

  • 过期字典的键是一个指针,指向键空间(数据库级别的属性,指向保存的键值对)的某个键
  • 过期字典的值是long long类型的整数,用于保存毫秒精度的unix时间戳

3.移除过期时间

persist key 

4.判断是否过期

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

5.过期键删除策略

(1)定时删除:过期就马上删除。节省CPU内存,占用太多CPU时间(花费时间时刻盯着哪个键即将过期),影响服务器的响应时间和吞吐量。

(2)惰性删除:过期不删除,被访问才删除。浪费CPU内存存储,不花费CPU时间去删除,大量无用数据堆积在数据库中。

  • 具体由db.c/expireIfNeeded函数实现,所有读写数据库的redis命令在执行之前都会调用该函数检查键是否过期:如果键已过期,则删除键;否则不改动。
  • 读写数据库的redis命令必须能实现 键不存在 和 键存在以及是否过期 几种情况。

(3)定期删除:对时间空间的折中方案,每隔一段时间执行一次过期键删除操作,至于什么时候删除、多久删除一次根据具体情况合理设置。

  • 具体由redis.c/activeExpireCycle函数实现,每当redis的周期性操作redis.c/serverCron函数执行时都会调用。在规定时间内,分多次遍历服务器中的各个数据库,从expires过期字典随机检查一部分键的过期时间,并删除其中的过期键。

redis服务器实际使用的是惰性删除和定期删除两种策略。

6.RDB对过期键的处理

  • 生成RDB文件时直接忽略掉过期的键
  • 载入RDB文件时,主服务器不会保存过期键,从服务器保留所有键

7.AOF对过期键的处理

(1)如果客户端访问没有被删除的过期键,则执行顺序如下

  • 从数据库中删除过期键
  • 追加一条删除命令进AOF文件
  • 向客户端返回空

(2)AOF重写不会保存过期的键

8.主从复制对过期键的处理

  • 主服务器删除一个过期键后,会通告所有从服务器发送一个del命令,让所有从服务器删除过期键
  • 从服务器执行读指令时,遇到没有删除的过期键,依旧会返回一个值,也不会删除,当做未过期键一样处理;从服务器只有等主服务器发来del命令才会删除

 


 参考&引用

《redis设计与实现》

原文地址:https://www.cnblogs.com/shoulinniao/p/13470440.html