Redis 过期键删除策略

redis 数据库键的过期时间都保存在过期字典中,过期字典的键是一个指针,指向键空间下的一个对象(也就是某个数据库键),过期字典的值是一个 long long 类型的整数,这个整数保存了数据库键的过期时间,一个毫秒精确度的 UNIX 时间戳。

过期键的判定

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

如果一个键过期了,redis 什么时候删除它呢?

删除策略

定时删除

在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时间来临时,立即对键进行删除

定时删除策略对内存是最友好的,通过定时器可以保证过期的键尽快的被删除,释放内存
对 CPU 是最不友好的,在过期键比较多的情况下,删除过期键这一行为会占用非常多的 CPU。会对服务器的响应时间和吞吐量造成影响。

惰性删除

每次从数据库中获取键时判断它是不是过期了,如果是过期的就删掉该键。

对 CPU 时间来说是最友好的,
对内存是最不友好的,如果一个键已经过期,一直没有访问的话那么这个键一直不会被删掉,其对应的内存一直不会被释放。某种程度上可以说是内存泄露。

定期删除

每隔一段时间,程序就对数据库进行一次检查,删除过期的键。

定期删除策略是前面两种策略的一种整合和折中。

定期删除策略每隔一段时间执行一次删除过期键的操作,并通过限制操作的时长和频率来减少操作对 CPU 带来的影响

有效的减少了内存的浪费。

定期删除策略的难点是确定删除操作的时长的频率

RDB、AOF 和复制功能对过期键的处理

生成 RDB 文件

在执行 SAVE 或者 BGSAVE 命令创建一个新的 RDB 文件时,程序会对数据库中的键进行检查,已过期的键不会保存到 RDB 文件中。

载入 RDB 文件

在启动 Redis 时,如果启用了 RDB 功能,那么服务器将对 RDB 文件进行载入:

  1. 如果是 master,过期键不会载入
  2. 如果是 slave,载入全部的,但主从服务器在进行数据同步时,从服务器上的数据会全部清空,

AOF 追加

如果一个键在 AOF 中已经存在,当它过期时会往 AOF 文件中追加一条删除命令来记录该键已被删除

AOF 重写

在执行 AOF 重写的过程中,程序会对数据库键进行检查,已经删除的键不会出现在重写后的文件中。

复制

从服务器的删除操作由主服务器控制
当键在主服务器上被删除时,主服务器会显示的发一条 DEL 指令到从服务器,告知从服务器删除这个过期键

2022/04/21 16:40 下午 posted in  redis