Redis 键的生存时间和过期时间

629 阅读2分钟

Redis的键可以设置生存时间和过期时间,这个过期时间是如何设置的呢,可以简单看下:

通过 EXPIRE 命令或者 PEXPIRE 命令,客户端可以以秒或者毫秒精度为数据库中的某个键设置生存时间(TTL),在经过制定的秒数或者毫秒数之后,服务器就会自动删除生存时间为0的键。

过期键删除策略研究

一个键过期了,什么时候会被删除呢?这个问题有三种可能的答案,分别代表了三种不同的删除策略:

  • 定时删除:在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时间来临时,立即执行对键的删除操作。这种策略对内存是友好的,保证过期键尽可能的被删除。对CPU时间是不友好的,在过期键很多的情况下,删除过期键往往耗费了不少的CPU资源;
  • 惰性删除:放任键过期不管,但每次获取键时,查询是否过期,如果过期就删除该键,否则就返回该键。这种策略对CPU时间是友好的,因为只有访问的时候才判断是否删除,基本不占用CPU资源。但是对内存又是不友好的,有很多键不会再被访问但是不会被删除,一直存在内存中;
  • 定期删除:每隔一段时间,程序就要对数据库进行一次检查,删除里面的过期键,这种策略难点是定期执行的频率和时长不好把控。

Redis实际上使用的是惰性删除和定期删除,惰性策略,大家可以仔细研究一下。

AOF 和 RDB对过期键的处理

生成RDB文件

在创建一个新的RDB文件时,程序会对数据库中的键进行检查,已经过期的键不会被保存在新创建的RDB文件中。

载入RDB文件

当服务器是主服务器时,RDB文件中过期的键将被忽略;当服务器是从服务器时,RDB文件中的过期的键将被会写入数据库。

AOF文件写入

当服务器以AOF持久化运行时,如果数据库的某个键已经过期,但是还没有被删除,那么AOF文件不受影响。

AOF重写

在执行AOF重写时,程序会对数据库中的键进行检查,已经过期的键不会被保存在重写的AOF文件中。

总结

Redia对键的过期删除主要是定期删除和惰性删除两种。