温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

redis设置生存和过期时间的原理是什么

发布时间:2022-08-27 14:43:21 来源:亿速云 阅读:216 作者:iii 栏目:开发技术

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

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

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

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

    redis设置生存和过期时间的原理是什么

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

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

    redis设置生存和过期时间的原理是什么

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

    redis设置生存和过期时间的原理是什么

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

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

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

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

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

    原理

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

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

    redis设置生存和过期时间的原理是什么

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

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

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

    redis设置生存和过期时间的原理是什么

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

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

    redis设置生存和过期时间的原理是什么

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

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

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

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

    redis设置生存和过期时间的原理是什么

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

    redis设置生存和过期时间的原理是什么

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

    redis设置生存和过期时间的原理是什么

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

    redis设置生存和过期时间的原理是什么

    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设置生存和过期时间的原理是什么”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注亿速云行业资讯频道。

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI