大厂常问面试题,Redis的过期策略,你了解多少?
希望大家能关注点赞,创作不易且没收益,您的小小举动却能给予我大大的鼓励,会激励我继续创作出高质量文章,更多内容可看我主页~
先说一下对 key 设置过期时间的命令。 设置 key 过期时间的命令一共有 4 个:
当然,在设置字符串时,也可以同时对 key 设置过期时间,共有 3 种命令:
如果你想查看某个 key 剩余的存活时间,可以使用 TTL 命令。
# 设置键值对的时候,同时指定过期时间位 60 秒
> setex key1 60 value1
OK
# 查看 key1 过期时间还剩多少
> ttl key1
(integer) 56
> ttl key1
(integer) 52
如果突然反悔,取消 key 的过期时间,则可以使用 PERSIST 命令。
# 取消 key1 的过期时间
> persist key1
(integer) 1
# 使用完 persist 命令之后,
# 查下 key1 的存活时间结果是 -1,表明 key1 永不过期
> ttl key1
(integer) -1
每当我们对一个 key 设置了过期时间时,Redis 会把该 key 带上过期时间存储到一个过期字典(expires dict)中,也就是说「过期字典」保存了数据库中所有 key 的过期时间。
过期字典存储在 redisDb 结构中,如下:
typedef struct redisDb {
dict *dict; /* 数据库键空间,存放着所有的键值对 */
dict *expires; /* 键的过期时间 */
....
} redisDb;
过期字典数据结构结构如下:
过期字典的数据结构如下图所示:
字典实际上是哈希表,哈希表的最大好处就是让我们可以用 O(1) 的时间复杂度来快速查找。当我们查询一个 key 时,Redis 首先检查该 key 是否存在于过期字典中:
过期键判断流程如下图所示:
在说 Redis 过期删除策略之前,先跟大家介绍下,常见的三种过期删除策略:
接下来,分别分析它们的优缺点。
定时删除策略的做法是,在设置 key 的过期时间时,同时创建一个定时事件,当时间到达时,由事件处理器自动执行 key 的删除操作。
定时删除策略的优点:
定时删除策略的缺点:
惰性删除策略的做法是,不主动删除过期键,每次从数据库访问 key 时,都检测 key 是否过期,如果过期则删除该 key。
惰性删除策略的优点:
惰性删除策略的缺点:
定期删除策略的做法是,每隔一段时间「随机」从数据库中取出一定数量的 key 进行检查,并删除其中的过期key。
定期删除策略的优点:
定期删除策略的缺点: