Redis过期处理和内存清除

Posted by KANG's BLOG on Tuesday, March 15, 2022

常用命令

1. 设置过期时间

  • expire

  • pexpire

  • expireat

  • pexpireat

p开头代表以毫秒为单位

at结尾代表在某一刻过期

非at结尾代表多长时间后过期

2. 查询过期时间

ttl - 键的剩余生存时间(秒)

pttl - 键的剩余生存时间(毫秒)

通过计算过期时间和当前时间的时间差来实现

内存清除策略

  1. volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
  2. allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
  3. volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
  4. volatile-lfu:从已设置过期时间的数据集(server.db[i].expires)中挑选最近使用次数最少的数据淘汰
  5. allkeys-lfu:从数据集(server.db[i].dict)中挑选最近使用次数最少的数据淘汰
  6. volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
  7. allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
  8. no-enviction(默认):禁止驱逐数据

过期键删除策略

1. 定时删除

创建键的过期时间的同时,创建一个定时器(timer),让定时器在键的过期时间来临时,立即执行对键的删除操作

2. 定期删除

每隔一段时间,从一定数量的数据库中取出一定数量的随机键进行检查,删除其中过期的键。

3. 惰性删除

redis每次从键空间获取键时,都检查取的的键是否过期,如果过期的话,就删除该键;如果没有过期,则返回该键

所有读写数据库的Redis命令在执行之前都会调用expireIfNeeded函数对输入键进行检查:

  • 如果输入键已经过期,那么函数将输入键从数据库中删除
  • 如果输入键未过期,那么函数不做动作

AOF和RDB对过期键的处理

1. RDB

生成RDB文件时,程序会对数据库中的键进行检查,已过期的键不会被保存到新创建的RDB文件中

再入RDB文件时,程序会对文件中保存的键进行检查,未过期的键会被载入到数据库中,而过期的键会被忽略。

2. AOF

如果数据库中的某个键已经过期,但还没有被删除,那么AOF文件不会因为这个过期键而产生任何影响,当过期键被删除时,程序会向AOF文件追加一条DEL命令来显式的记录该键已被删除

AOF重写:已过期的键不会被保存到重写后的AOF文件中

当服务器运行在复制模式下时,从服务器的过期键删除动作由主服务器控制,只有在接到主服务器发来的DEL命令时,才会删除过期键,在这之前,即使就碰到过期键也不会将其删除,而是继续像处理未过期的键一样来处理过期键