键的生存时间与过期

131 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

redisDb结构的expires字典保存了数据库中所有键的过期时间,称这个字典为过期字典:
过期字典的键是一个指针,指向键空间中的某个键对象;
值是一个long long类型的整数,指向数据库的过期时间,毫秒精度。

设置过期时间:
expire key ttl
pexpire key ttl
expireat key timestamp
pexpireat key timestamp

前3个命令都是使用pexpireat来实现的

返回剩余生存时间:
ttl
pttl

过期键的删除策略

定时删除

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

优缺点:

  1. 过期键会被尽快删除并释放内存,从而节省内存
  2. 占用cpu,影响数据库的响应时间和吞吐量(查找事件的时间复杂度为O(n))

惰性删除

放任过期键不管,但每次获取键时检查键是否过期,如果过期的话执行删除键操作

优缺点:

  1. 占用很少的CPU,只有当取键时才可能对键进行删除,也就是说删除操作只会在非做不可的情况下进行。
  2. 无用的过期键可能一直没有被删除,从而会占用大量的内存导致内存资源紧张。

定期删除

每隔一段时间对数据库进行一次检出,删除里面的过期键。至于删除多少个过期键、检查多少个数据库则由算法来决定。

难以确定删除操作执行的时长和频率:

  1. 如果太频繁或者执行时间过长,退化成定时删除,导致CPU时间过多地消耗在删除过期键上面;
  2. 如果执行的太少或者时间太短,退化成惰性删除,出现浪费内存。

redis中采用的是惰性删除+定期删除