Redis怎么设置生存和过期时间

67次阅读
没有评论

共计 2041 个字符,预计需要花费 6 分钟才能阅读完成。

这篇“Redis 怎么设置生存和过期时间”文章的知识点大部分人都不太理解,所以丸趣 TV 小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Redis 怎么设置生存和过期时间”文章吧。

在了解原理前 先来看使用方法

通过 EXPIRE 命令或者 PEXPIRE 命令,客户端可以以秒或者毫秒精度为数据库中的某个键设置生存时间,在经过指定的秒数或者毫秒数之后,服务器就会自动删除生存时间为 0 的键。

SETEX 命令可以在设置一个字符串键的同时为键设置过期时间(只能用于字符串键)

与 EXPIRE 命令和 PEXPIRE 命令类似,客户端可以通过 EXPIREAT 命令或 PEXPIREAT 命令,以秒或者毫秒精度给数据库中的某个键设置过期时间

过期时间是一个 UNIX 时间戳,当键的过期时间来临时,服务器就会自动从数据库中删除这个键

TTL 命令和 PTTL 命令接受一个带有生存时间或者过期时间的键,返回这个键的剩余生存时间,也就是,返回距离这个键被服务器自动删除还有多长时间

Redis 有四个不同的命令可以用于设置键的生存时间(键可以存在多久)或过期时间(键什么时候会被删除):

EXPIRE命令用于将键 key 的生存时间设置为 ttl 秒。

PEXPIRE命令用于将键 key 的生存时间设置为 ttl 毫秒。

EXPIREAT命令用于将键 key 的过期时间设置为 timestamp 所指定的秒数时间戳。

PEXPIREAT命令用于将键 key 的过期时间设置为 timestamp 所指定的毫秒数时间戳。

原理

虽然有多种不同单位和不同形式的设置命令,但实际上 EXPIRE、PEXPIRE、EXPIREAT 三个命令都是使用 PEXPIREAT 命令来实现的:

无论客户端执行的是以上四个命令中的哪一个,经过转换之后,最终的执行效果都和执行 PEXPIREAT 命令一样。

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

过期字典的键是一个指针,这个指针指向键空间中的某个键对象(也即是某个数据库键)。

过期字典的值是一个 long long 类型的整数,这个整数保存了键所指向的数据库键的过期时间——一个毫秒精度的 UNIX 时间戳。

下图展示了一个带有过期字典的数据库例子,在这个例子中,键空间保存了数据库中的所有键值对,而过期字典则保存了数据库键的过期时间。

为了展示方便,图中的键空间和过期字典中重复出现了两次 alphabet 键对象和 book 键对象。在实际中,键空间的键和过期字典的键都指向同一个键对象,所以不会出现任何重复对象,也不会浪费任何空间。

图中的过期字典保存了两个键值对:

第一个键值对的键为 alphabet 键对象,值为 1385877600000,这表示数据库键 alphabet 的过期时间为 1385877600000(2013 年 12 月 1 日零时)。

第二个键值对的键为 book 键对象,值为 1388556000000,这表示数据库键 book 的过期时间为 1388556000000(2014 年 1 月 1 日零时)。当客户端执行 PEXPIREAT 命令(或者其他三个会转换成 PEXPIREAT 命令的命令)为一个数据库键设置过期时间时,服务器会在数据库的过期字典中关联给定的数据库键和过期时间。

在服务器执行以下命令之后

过期字典将新增一个键值对,其中键为 message 键对象,而值则为 1391234400000(2014 年 2 月 1 日零时),如图

以下是 PEXPIREAT 命令的伪代码定义

PERSIST 命令可以移除一个键的过期时间

PERSIST 命令就是 PEXPIREAT 命令的反操作:PERSIST 命令在过期字典中查找给定的键,并解除键和值(过期时间)在过期字典中的关联。

过期键的判定

通过过期字典,程序可以用以下步骤检查一个给定键是否过期:

1)检查给定键是否存在于过期字典:如果存在,那么取得键的过期时间。

2)检查当前 UNIX 时间戳是否大于键的过期时间:如果是的话,那么键已经过期;否则的话,键未过期。可以用伪代码来描述这一过程:

Redis 怎么设置生存和过期时间

对于一个过期时间为 1385877600000(2013 年 12 月 1 日零时)的键 alphabet 来说:

如果当前时间为 1383282000000(2013 年 11 月 1 日零时),那么调用 is_expired(alphabet)将返回 False,因为当前时间小于 alphabet 键的过期时间。

另一方面,如果当前时间为 1385964000000(2013 年 12 月 2 日零时),那么调用 is_expired(alphabet)将返回 True,因为当前时间大于 alphabet 键的过期时间。

以上就是关于“Redis 怎么设置生存和过期时间”这篇文章的内容,相信大家都有了一定的了解,希望丸趣 TV 小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注丸趣 TV 行业资讯频道。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-13发表,共计2041字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)