2024-05-02
版权声明:本文为博主付费文章,严禁任何形式的转载和摘抄,维权必究。 本文链接:https://www.skjava.com/mianshi/baodian/detail/1264038401

回答

Redis 通过一个叫做过期字典(可以看作是hash表)来保存数据过期的时间。

当我们为一个 key 设置过期时间,例如 SET sike sike-java EX 100 ,Redis 会在国企字典中添加一个题目,其中 key 指向该键(sike),value 是当前时间加上指定的秒数(转换成的Unix时间戳)。

数据结构如下:

typedef struct redisDb {
    ...
    
    dict *dict;     //数据库键空间,保存着数据库中所有键值对
    dict *expires   // 过期字典,保存着键的过期时间
    ...
} redisDb;

我们知道 Redis 的过期数据删除分为两种策略:惰性删除和定时删除。

  • 惰性删除:每次访问某个 key 时,Redis 会首先在过期字典中查找这个 key,如果已找到且时间戳大于当前时间戳,表明该 key 已过期,则 Redis 会立刻从从所有相关的数据结构中删除该 key,包括过期字典和该 key 本身的数据结构。
  • 定时删除:Redis 定期从过期字典中随机获取一批 key,检查他们是否已过期。

更多关于惰性删除和定时删除请阅读:Redis key过期了,为什么内存没释放呢?