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)定时删除:过期就马上删除,节省内存。如果有太多键需要删除,则执行大量的删除操作,会影响服务器的响应时间和吞吐量。

(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命令才会删除

 二、回收策略

 1、几种回收策略

  • volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中,淘汰最近最少使用的数据
  • volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中,淘汰最早会过期的数据
  • volatile-random:从已设置过期时间的数据集(server.db[i].expires)中,随机淘汰数据
  • allkeys-lru:从数据集(server.db[i].dict)中,淘汰最近最少使用的数据
  • allkeys-random:从数据集(server.db[i].dict)中,随机淘汰数据
  • noenviction:Redis 的默认策略,不回收数据,当达到最大内存时,新增数据返回 error

volatile 是对已设置过期时间的数据集淘汰数据
allkeys 是从全部数据集淘汰数据
lru 是 Least Recently Used 的缩写,即最近最少使用
ttl 指令可以获取键到期的剩余时间(秒),这里的意思是淘汰最早会过期的数 

posted @ 2020-08-21 19:48  守林鸟  阅读(284)  评论(0编辑  收藏  举报