广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >浅谈redis的过期时间设置和过期删除机制
  • 751
分享到

浅谈redis的过期时间设置和过期删除机制

2024-04-02 19:04:59 751人浏览 泡泡鱼
摘要

目录一:设置过期时间二:保存过期时间三:移除过期时间四:计算并返回剩余生存时间五:过期键的删除策略六:Redis使用的策略一:设置过期时间 redis有四种命令可以用于设置键的生存时

一:设置过期时间

redis有四种命令可以用于设置键的生存时间和过期时间:

  • EXPIRE <KEY> <TTL> : 将键的生存时间设为 ttl 秒
  • PEXPIRE <KEY> <TTL> :将键的生存时间设为 ttl 毫秒
  • EXPIREAT <KEY> <timestamp> :将键的过期时间设为 timestamp 所指定的秒数时间戳
  • PEXPIREAT <KEY> <timestamp>: 将键的过期时间设为 timestamp 所指定的毫秒数时间戳.

二:保存过期时间

那么redis里面对这些key的过期时间和生存时间的信息是怎么保存的呢??
答:在数据库结构redisDb中的expires字典中保存了数据库中所有键的过期时间,我们称expire这个字典为过期字典。
(1)过期字典是一个指针,指向键空间的某个键对象。
(2)过期字典的值是一个longlong类型的整数,这个整数保存了键所指向的数据库键的过期时间–一个毫秒级的 UNIX 时间戳。

下图是一个带过期字典的数据库例子:

过期字典是存储在redisDb这个结构里的:

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

从以上结构中可以看到expire字典(过期字典)和dict字典(数据库键空间,保存着数据库中所有键值对)是并列的,由此可见expire字典的重要性。

三:移除过期时间

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

127.0.0.1:6379> set message "hello"
OK
127.0.0.1:6379> expire message 60
(integer) 1
127.0.0.1:6379> ttl message
(integer) 54
127.0.0.1:6379> persist message
(integer) 1
127.0.0.1:6379> ttl message
(integer) -1

persist命令就是expire命令的反命令,这个函数在过期字典中查找给定的键,并从过期字典中移除。
比如在数据库当前状态(如上图所示),当给book这个key移除过期时间:

redis> persist book
(integer) 1

数据库将更新成如下状态:

可以从图中看到,当PERSIST book命令执行之后,过期字典中的 book 键消失了。

四:计算并返回剩余生存时间

ttl命令以秒为单位返回指定键的剩余生存时间。pttl以毫秒返回。两个命令都是通过计算当前时间和过期时间的差值得到剩余生存期的。

127.0.0.1:6379> set minping shuxin
OK
127.0.0.1:6379> expire minping 60
(integer) 1
127.0.0.1:6379> ttl minping
(integer) 57
127.0.0.1:6379> ttl minping
(integer) 27
127.0.0.1:6379> pttl minping
(integer) 23839
127.0.0.1:6379>

redis源码为:

void ttlCommand(redisClient *c) {
    ttlGenericCommand(c, 0);
}
void pttlCommand(redisClient *c) {
    ttlGenericCommand(c, 1);
}
void ttlGenericCommand(redisClient *c, int output_ms) {
    long long expire, ttl = -1;
    
    if (lookupKeyRead(c->db,c->argv[1]) == NULL) {
        addReplyLongLong(c,-2);
        return;
    }
    
    
    
    expire = getExpire(c->db,c->argv[1]);
    if (expire != -1) {
        
        ttl = expire-mstime();
        if (ttl < 0) ttl = 0;
    }
    if (ttl == -1) {
        addReplyLongLong(c,-1);
    } else {
         
        addReplyLongLong(c,output_ms ? ttl : ((ttl+500)/1000));
    }
}

五:过期键的删除策略

如果一个键是过期的,那它到了过期时间之后是不是马上就从内存中被被删除呢??如果不是,那过期后到底什么时候被删除呢??

其实有三种不同的删除策略:
(1):立即删除。在设置键的过期时间时,创建一个回调事件,当过期时间达到时,由时间处理器自动执行键的删除操作。
(2):惰性删除。键过期了就过期了,不管。每次从dict字典中按key取值时,先检查此key是否已经过期,如果过期了就删除它,并返回nil,如果没过期,就返回键值。
(3):定时删除。每隔一段时间,对expires字典进行检查,删除里面的过期键。
可以看到,第二种为被动删除,第一种和第三种为主动删除,且第一种实时性更高。下面对这三种删除策略进行具体分析。

立即删除

立即删除能保证内存中数据的最大新鲜度,因为它保证过期键值会在过期后马上被删除,其所占用的内存也会随之释放。但是立即删除对cpu是最不友好的。因为删除操作会占用cpu的时间,如果刚好碰上了cpu很忙的时候,比如正在做交集或排序等计算的时候,就会给cpu造成额外的压力。

而且目前redis事件处理器对时间事件的处理方式--无序链表,查找一个key的时间复杂度为O(n),所以并不适合用来处理大量的时间事件。

惰性删除

惰性删除是指,某个键值过期后,此键值不会马上被删除,而是等到下次被使用的时候,才会被检查到过期,此时才能得到删除。所以惰性删除的缺点很明显:浪费内存。dict字典和expires字典都要保存这个键值的信息。

举个例子,对于一些按时间点来更新的数据,比如log日志,过期后在很长的一段时间内可能都得不到访问,这样在这段时间内就要拜拜浪费这么多内存来存log。这对于性能非常依赖于内存大小的redis来说,是比较致命的

定时删除

从上面分析来看,立即删除会短时间内占用大量cpu,惰性删除会在一段时间内浪费内存,所以定时删除是一个折中的办法。
定时删除是:每隔一段时间执行一次删除操作,并通过限制删除操作执行的时长和频率,来减少删除操作对cpu的影响。另一方面定时删除也有效的减少了因惰性删除带来的内存浪费。

六:redis使用的策略

redis使用的过期键值删除策略是:惰性删除加上定期删除,两者配合使用。

到此这篇关于浅谈redis的过期时间设置和过期删除机制的文章就介绍到这了,更多相关redis的过期时间设置和过期删除内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 浅谈redis的过期时间设置和过期删除机制

本文链接: https://www.lsjlt.com/news/142958.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 浅谈redis的过期时间设置和过期删除机制
    目录一:设置过期时间二:保存过期时间三:移除过期时间四:计算并返回剩余生存时间五:过期键的删除策略六:redis使用的策略一:设置过期时间 redis有四种命令可以用于设置键的生存时...
    99+
    2022-11-13
  • Redis 过期键的设置、获取和删除过期时间
    Redis 过期键的设置、获取和删除过期时间 设置过期 默认情况下键是没有生存时间的,也就是永不过期,除非清空内存。 设置的键的生存时间也很容易,可以通过4个命令设置(任选一即可):EXPIRE、PEXP...
    99+
    2022-10-18
  • 浅谈Redis 中的过期删除策略和内存淘汰机制
    目录前言Redis 中 key 的过期删除策略1、定时删除2、惰性删除3、定期删除Redis 中过期删除策略从库是否会脏读主库创建的过期键内存淘汰机制内存淘汰触发的最大内存有哪些内存...
    99+
    2022-11-13
  • 浅谈Redis中的自动过期机制
    目录Redis中的自动过期机制一、使用Redis Key自动过期机制二、SpringBoot整合key失效监听Redis中的自动过期机制 实现需求:处理订单过期自动取消,比如下单30...
    99+
    2022-11-13
  • Redis设置key的过期时间
    Redis中可以设置数据的过期时间,一旦过期自动删除数据。 1.设置过期时间 expire 127.0.0.1:6379> set name "ok" //设置10s后过期,e...
    99+
    2023-01-28
    Redis设置key过期时间 Redis key过期时间
  • Redis系列(六):设置/移除键的过期时间
    本篇博客是Redis系列的第6篇,主要讲解以下内容: 数据库数量 切换目标数据库 设置键的过期时间 移除键的过期时间 本系列的前5篇可以点击以下链接查看: Redis系列(一):Redis简介及环境安装 Redis系列(二):...
    99+
    2019-07-09
    Redis系列(六):设置/移除键的过期时间
  • Redis怎么设置生存和过期时间
    这篇“Redis怎么设置生存和过期时间”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Red...
    99+
    2022-10-19
  • 浅谈Redis中的内存淘汰策略和过期键删除策略
    目录8种淘汰策略过期键的删除策略总结 redis是我们现在最常用的一个工具,帮助我们建设系统的高可用,高性能。 而且我们都知道redis是一个完全基于内存的工具,这也是redis速...
    99+
    2022-11-12
  • Redis 过期删除策略和内存淘汰机制
          Redis 设置过期时间 Redis 有四个不同的命令可以用于设置键的生存时间(键可以存在多久)或过期时间(键什么时候会被删除): EXPIRE ——将键 key 的生存时间设置为 ttl 秒。 PEXPIRE ——...
    99+
    2015-02-08
    Redis 过期删除策略和内存淘汰机制
  • 如何设置合适的redis过期时间
    这篇文章运用简单易懂的例子给大家介绍如何设置合适的redis过期时间,代码非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。          ...
    99+
    2022-10-18
  • Redis中怎么设置过期时间的Key
    Redis中怎么设置过期时间的Key,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1、 DEL/SET/GETSET等命令会清除过期时间在使用...
    99+
    2022-10-18
  • redis怎么设置默认的过期时间
    在Redis中,可以使用`EXPIRE`命令设置键的过期时间。但是,如果你想要为所有键设置一个默认的过期时间,可以使用Redis的`...
    99+
    2023-09-06
    redis
  • 怎么在redis中设置key的过期时间
    在redis中设置key过期时间的方法:1.启动redis服务;2.登录redis数据库;3.执行命令设置过期时间;具体步骤如下:首先,在命令行中启动redis服务;service redis start mysql服务启动后,输入用户名,...
    99+
    2022-10-22
  • redis 设置生存和过期时间的原理分析
    目录在了解原理前 先来看使用方法原理过期键的判定Redis的过期键删除策略原理在了解原理前 先来看使用方法 通过EXPIRE命令或者PEXPIRE命令,客户端可以以秒或者毫秒精度为数据库中的某个键设置生存时间,在经过指定...
    99+
    2022-08-27
  • redis 设置生存和过期时间的原理分析
    目录在了解原理前 先来看使用方法原理过期键的判定Redis的过期键删除策略原理在了解原理前 先来看使用方法 通过EXPIRE命令或者PEXPIRE命令,客户端可以以秒或者毫秒精度为数...
    99+
    2022-11-13
  • localStorage设置有效期和过期时间的简单方法
    目录前言实现思路实现代码总结前言 总所周知localStorage默认是不会过期的,也没有可设置过期的api,如果要实现过期清除就需要自己实现一个api 实现思路 在Storage原...
    99+
    2022-11-13
  • Redis如何批量设置过期时间(PIPLINE的使用)
    合理的使用缓存策略对开发同学来讲,就好像孙悟空习得自在极意功一般~ Redis如何批量设置过期时间呢? 不要说在foreach中通过set()函数批量设置过期时间 我们引入redis...
    99+
    2022-11-12
  • Redis中的过期删除策略和内存淘汰机制是什么
    这篇文章主要讲解了“Redis中的过期删除策略和内存淘汰机制是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Redis中的过期删除策略和内存淘汰机制是什么”吧!Redis 中 key 的...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作