我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Redis中怎么设置过期时间的Key

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Redis中怎么设置过期时间的Key

Redis中怎么设置过期时间的Key,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

1、 DEL/SET/GETSET等命令会清除过期时间

在使用DEL、SET、GETSET等会覆盖key对应value的命令操作一个设置了过期时间的key的时候,会导致对应的key的过期时间被清除。

//设置mykey的过期时间为300s 127.0.0.1:6379> set mykey hello ex 300 OK //查看过期时间 127.0.0.1:6379> ttl mykey (integer) 294 //使用set命令覆盖mykey的内容 127.0.0.1:6379> set mykey olleh OK //过期时间被清除 127.0.0.1:6379> ttl mykey (integer) -1

2、INCR/LPUSH/HSET等命令则不会清除过期时间

而在使用INCR/LPUSH/HSET这种只是修改一个key的value,而不是覆盖整个value的命令,则不会清除key的过期时间。

INCR:

//设置incr_key的过期时间为300s 127.0.0.1:6379> set incr_key 1 ex 300 OK 127.0.0.1:6379> ttl incr_key (integer) 291 //进行自增操作 127.0.0.1:6379> incr incr_key (integer) 2 127.0.0.1:6379> get incr_key "2" //查询过期时间,发现过期时间没有被清除 127.0.0.1:6379> ttl incr_key (integer) 277

LPUSH:

//新增一个list类型的key,并添加一个为1的值 127.0.0.1:6379> LPUSH list 1 (integer) 1 //为list设置300s的过期时间 127.0.0.1:6379> expire list 300 (integer) 1 //查看过期时间 127.0.0.1:6379> ttl list (integer) 292 //往list里面添加值2 127.0.0.1:6379> lpush list 2 (integer) 2 //查看list的所有值 127.0.0.1:6379> lrange list 0 1 1) "2" 2) "1" //能看到往list里面添加值并没有使过期时间清除 127.0.0.1:6379> ttl list (integer) 252

3、PERSIST命令会清除过期时间

当使用PERSIST命令将一个设置了过期时间的key转变成一个持久化的key的时候,也会清除过期时间。

127.0.0.1:6379> set persist_key haha ex 300 OK 127.0.0.1:6379> ttl persist_key (integer) 296 //将key变为持久化的 127.0.0.1:6379> persist persist_key (integer) 1 //过期时间被清除 127.0.0.1:6379> ttl persist_key (integer) -1

4、使用RENAME命令,老key的过期时间将会转到新key上

在使用例如:RENAME KEY_A KEY_B命令将KEY_A重命名为KEY_B,不管KEY_B有没有设置过期时间,新的key  KEY_B将会继承KEY_A的所有特性。

//设置key_a的过期时间为300s 127.0.0.1:6379> set key_a value_a ex 300 OK //设置key_b的过期时间为600s 127.0.0.1:6379> set key_b value_b ex 600 OK 127.0.0.1:6379> ttl key_a (integer) 279 127.0.0.1:6379> ttl key_b (integer) 591 //将key_a重命名为key_b 127.0.0.1:6379> rename key_a key_b OK //新的key_b继承了key_a的过期时间 127.0.0.1:6379> ttl key_b (integer) 248

这里篇幅有限,我就不一一将key_a重命名到key_b的各个情况列出来,大家可以在自己电脑上试一下key_a设置了过期时间,key_b没设置过期时间这种情况。

5、使用EXPIRE/PEXPIRE设置的过期时间为负数或者使用EXPIREAT/PEXPIREAT设置过期时间戳为过去的时间会导致key被删除

EXPIRE:

127.0.0.1:6379> set key_1 value_1 OK 127.0.0.1:6379> get key_1 "value_1" //设置过期时间为-1 127.0.0.1:6379> expire key_1 -1 (integer) 1 //发现key被删除 127.0.0.1:6379> get key_1 (nil)

EXPIREAT:

127.0.0.1:6379> set key_2 value_2 OK 127.0.0.1:6379> get key_2 "value_2" //设置的时间戳为过去的时间 127.0.0.1:6379> expireat key_2 10000 (integer) 1 //key被删除 127.0.0.1:6379> get key_2 (nil)

6、EXPIRE命令可以更新过期时间

对一个已经设置了过期时间的key使用expire命令,可以更新其过期时间。

//设置key_1的过期时间为100s 127.0.0.1:6379> set key_1 value_1 ex 100 OK 127.0.0.1:6379> ttl key_1 (integer) 95 //更新key_1的过期时间为300s 127.0.0.1:6379> expire key_1 300 (integer) 1 127.0.0.1:6379> ttl key_1 (integer) 295

在Redis2.1.3以下的版本中,使用expire命令更新一个已经设置了过期时间的key的过期时间会失败。并且对一个设置了过期时间的key使用LPUSH/HSET等命令修改其value的时候,会导致Redis删除该key。

Redis的过期策略

那你有没有想过一个问题,Redis里面如果有大量的key,怎样才能高效的找出过期的key并将其删除呢,难道是遍历每一个key吗?假如同一时期过期的key非常多,Redis会不会因为一直处理过期事件,而导致读写指令的卡顿。

这里说明一下,Redis是单线程的,所以一些耗时的操作会导致Redis卡顿,比如当Redis数据量特别大的时候,使用keys *  命令列出所有的key。

实际上Redis使用懒惰删除+定期删除相结合的方式处理过期的key。

懒惰删除

所谓懒惰删除就是在客户端访问该key的时候,redis会对key的过期时间进行检查,如果过期了就立即删除。

这种方式看似很完美,在访问的时候检查key的过期时间,不会占用太多的额外CPU资源。但是如果一个key已经过期了,如果长时间没有被访问,那么这个key就会一直存留在内存之中,严重消耗了内存资源。

定期删除

定期删除的原理是,Redis会将所有设置了过期时间的key放入一个字典中,然后每隔一段时间从字典中随机一些key检查过期时间并删除已过期的key。

Redis默认每秒进行10次过期扫描:

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. 从过期字典中随机20个key

  3. 删除这20个key中已过期的

  4. 如果超过25%的key过期,则重复第一步

同时,为了保证不出现循环过度的情况,Redis还设置了扫描的时间上限,默认不会超过25ms。

看完上述内容,你们掌握Redis中怎么设置过期时间的Key的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Redis中怎么设置过期时间的Key

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

下载Word文档

猜你喜欢

Redis设置key的过期时间

本文主要介绍了Redis设置key的过期时间,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-01-28

redis怎么设置过期时间

redis中的过期时间自动删除超过生命周期的键,可有效缓存短暂有效期的数据。设置过期时间有两种方法:1. expire命令,设置过期时间(秒);2. pexpire命令,设置过期时间(毫秒)。可通过ttl命令查询过期时间,返回剩余过期时间(
redis怎么设置过期时间
2024-05-21

Redis怎么设置键的过期时间

在Redis中,可以使用EXPIRE命令或者SET命令的EX参数来设置键的过期时间。使用EXPIRE命令:EXPIRE key seconds其中,key是要设置过期时间的键名,seconds是过期的秒数。例如,要让键mykey在60秒
Redis怎么设置键的过期时间
2024-05-07

redis怎么设置默认的过期时间

在Redis中,可以使用`EXPIRE`命令设置键的过期时间。但是,如果你想要为所有键设置一个默认的过期时间,可以使用Redis的`CONFIG`命令来修改`timeout`属性。下面是设置默认过期时间的步骤:1. 使用`CONFIG GE
2023-09-06

Redis怎么批量设置过期时间

这篇文章将为大家详细讲解有关Redis怎么批量设置过期时间,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Redis如何批量设置过期时间呢?不要说在foreach中通过set()函数批量设置过期时间我们引入
2023-06-21

redis在java怎么设置过期时间

本篇文章详细介绍了在Java中使用Jedis和Lettuce库为Redis键设置过期时间的方法。过期时间的单位可以是秒、毫秒、微秒或毫微秒。过期时间可以覆盖现有过期时间,并可以近似获取键的剩余生存时间。除了上述方法,还可以使用PEXPIRE、PEXPIREAT和PXAT命令设置过期时间。
redis在java怎么设置过期时间
2024-04-02

如何在Redis中设置过期时间

在Redis中设置过期时间可以使用EXPIRE命令或者EXPIREAT命令。使用EXPIRE命令设置过期时间:EXPIRE key seconds其中,key是要设置过期时间的键名,seconds是过期时间,单位是秒。例如,设置键名为myk
如何在Redis中设置过期时间
2024-04-09

redis怎么设置key的有效期

这篇文章主要介绍“redis怎么设置key的有效期”,在日常操作中,相信很多人在redis怎么设置key的有效期问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”redis怎么设置key的有效期”的疑惑有所帮助!
2023-06-26

java如何设置redis过期时间

如何设置Redis过期时间(Java版)本文详细介绍了使用Java在Redis中设置过期时间的方法,包括EXPIRE、EXPIREAT、SETEX、PSETEX和PERSIST命令。还提供了最佳实践建议,例如根据键值对访问频率设置过期时间、使用SCAN命令删除过期键值对以及使用Redis的过期策略功能。
java如何设置redis过期时间
2024-04-02

redis如何设置不过期时间

在 Redis 中设置键不过期的方法有两种:1. 不设置过期时间:在设置键时,不指定过期时间参数即可。例如使用 `SET key value` 命令设置键值对,该键就不会设置过期时间。2. 使用持久化方法:通过持久化方式将数据保存在磁盘中,
2023-09-05

php redis如何设置过期时间

本文将为大家详细介绍“php redis如何设置过期时间”,内容步骤清晰详细,细节处理妥当,而小编每天都会更新不同的知识点,希望这篇“php redis如何设置过期时间”能够给你意想不到的收获,请大家跟着小编的思路慢慢深入,具体内容如下,一
2023-06-06

asp中怎么设置session过期时间

在ASP中,可以通过设置Session对象的Timeout属性来设置Session的过期时间。Timeout属性表示Session的有效期,单位为分钟。例如,将Session的过期时间设置为30分钟:```Session.Timeout =
2023-08-18

编程热搜

目录