redis 设置生存和过期时间的原理分析

 更新时间:2022年08月27日 09:54:00   作者:奔跑的海星  
这篇文章主要介绍了redis 设置生存和过期时间的原理,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

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

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

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

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

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

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

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命令一样。

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时间戳是否大于键的过期时间:如果是的话,那么键已经过期;否则的话,键未过期。可以用伪代码来描述这一过程:

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

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

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

Redis的过期键删除策略原理

https://www.jb51.net/article/260852.htm

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • redis protocol通信协议及使用详解

    redis protocol通信协议及使用详解

    这篇文章主要为大家介绍了redis protocol通信协议及使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • Redis 数据类型的详解

    Redis 数据类型的详解

    这篇文章主要介绍了Redis 数据类型的详解的相关资料,支持五种数据类型,字符串,哈希,列表,集合及zset,需要的朋友可以参考下
    2017-08-08
  • 为啥懒 Redis 是更好的 Redis

    为啥懒 Redis 是更好的 Redis

    本文是由zicode, 李中凯, 无若翻译的英文文章Lazy Redis is better Redis,小编认为非常不错,这里推荐给大家
    2018-07-07
  • Redis集群(cluster模式)搭建过程

    Redis集群(cluster模式)搭建过程

    文章介绍了Redis集群的概念、使用原因和搭建方法,Redis集群通过分区实现数据水平扩容,提供了一定的可用性,文章详细阐述了集群的连接方式,解释了如何分配节点,并提供了详细的集群搭建步骤,包括创建节点、清空数据、修改配置、启动节点、配置集群等
    2024-10-10
  • Redis使用布隆过滤器解决缓存雪崩的问题

    Redis使用布隆过滤器解决缓存雪崩的问题

    布隆过滤器可以帮助我们解决Redis缓存雪崩的问题,那什么是布隆过滤器、布隆过滤器又是如何使用如何解决缓存雪崩的问题的,让我们带着这一系列的问题去详细了解布隆过滤器,感兴趣的小伙伴跟着小编一起来看看吧
    2024-02-02
  • Redis中的bitmap详解

    Redis中的bitmap详解

    BitMap是通过一个bit位来表示某个元素对应的值或者状态,其中的key就是对应元素本身。我们知道8个bit可以组成一个Byte,所以bitmap本身会极大的节省储存空间,下面通过本文给大家介绍Redis中的bitmap知识,感兴趣的朋友一起看看吧
    2021-10-10
  • Redis ziplist 压缩列表的源码解析

    Redis ziplist 压缩列表的源码解析

    ziplist 是一个经过特殊编码的双向链表,旨在提高内存效率,它存储字符串和整数值,其中整数被编码为实际整数而不是一系列字符,这篇文章主要介绍了Redis ziplist 压缩列表的源码解析,需要的朋友可以参考下
    2022-06-06
  • Redis GEO实现附近搜索功能

    Redis GEO实现附近搜索功能

    这篇文章主要介绍了Redis GEO实现附近搜索功能,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2024-12-12
  • 在项目中使用redis做缓存的一些思路

    在项目中使用redis做缓存的一些思路

    这篇文章主要介绍了在项目中使用redis做缓存的一些思路,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • 一文详细介绍Redis7持久化机制RDB和AOF

    一文详细介绍Redis7持久化机制RDB和AOF

    这篇文章主要给大家分享一下Redis的数据持久化方式,Reids是一个高性能的缓存中间件,它的高性能是因为它是基于内存的,我们知道直接操纵内存是比较快的,所以当机器发生宕机,那么数据就会完全丢失,所以本文详细介绍Redis7持久化机制RDB和AOF
    2023-07-07

最新评论