Redis键的过期时间

2024-11-12 ⏳0.6分钟(0.3千字)

文章参考:《Redis 设计与实现》黄建宏

设置过期时间

通过 EXPIRE 或者 PEXPIRE 命令,客户端可以以秒或毫秒精度为数据库中的某个键设置生存时间 TTL (Time To Live)

SETEX 命令可以设置一个字符串的同时为键设置过期时间

保存过期时间

redisDb 结构的 expires 字典保存了数据库中所有键的过期时间,我们称这个字典为过期字典:

typedef struct redisDb{
  // ...
  // 过期字典
  dict *expires;
  // ...
} redisDb;
image1

过期键的删除策略

  1. 定时删除:在设置键的过期时间同时,创建一个定时器 timer,让定时器在键的过期时间来临时,立即执行对键的删除操作, 对内存最友好,占用大量 CPU,所以现阶段不现实
  2. 惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期就删除该键,如果没有过期,就返回该键,对 CPU 友好,对内存不友好

在使用惰性删除策略时,如果数据库中有非常多的过期键,而这些过期键又恰好没有被访问到的话,那他们也许永远也不会被删除,除非手动执行 FLUSHDB, 我们甚至可以将这种情况看作是一种内存泄漏,这对于运行状态非常依赖内存的 Redis 服务器来说,肯定不是一个好消息。

  1. 定期删除:每隔一段时间,程序就对数据库进行一次检查, 删除里面的过期键

Redis 就同时使用了惰性删除和定期删除两种策略