redis查看key的过期时间_面试官:你在Redis中设置过带过期时间的Key吗?

点击上方小伟后端笔记关注公众号

每天阅读Java干货文章

7753f582e5434b4344894bc57d8c1005.png

熟悉Redis的同学应该知道,Redis的每个Key都可以设置一个过期时间,当达到过期时间的时候,这个key就会被自动删除。

在为key设置过期时间需要注意的事项

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

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

//设置mykey的过期时间为300s127.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的过期时间为300s127.0.0.1:6379> set incr_key 1 ex 300
OK127.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
OK127.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的过期时间为300s127.0.0.1:6379> set key_a value_a ex 300
OK//设置key_b的过期时间为600s127.0.0.1:6379> set key_b value_b ex 600
OK127.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
OK127.0.0.1:6379> get key_1"value_1"//设置过期时间为-1127.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
OK127.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的过期时间为100s127.0.0.1:6379> set key_1 value_1 ex 100
OK127.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. 从过期字典中随机20个key

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

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

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

作者:千山qianshan

来源:juejin.im/post/5d6bda096fb9a06acc009dc8—END—

推荐阅读:

面试官:为什么 HashMap 的加载因子是0.75?

面试官: 为什么 SQL 语句不要过多的 join?
你还在被 Java NIO 虐?该试试 Netty 了!

新手也能看懂的源码阅读技巧试

2a6072e4fed4da294f627eb866f28c73.png

如果文章对您有帮助,请您分享、点赞、在看,一波三连支持一下作者,非常感谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/297069.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop学习系列之PageRank

昨晚上不想做其他的事,突然想起来好久都没更新博客了,shell也差不多学完了,只不过学习的时候都是只带着书出去了,改天总结总结。Hadoop么,黄宜华老师讲完了,自己也马马虎虎快学完了,也是没总结&…

您的屁股发热严重,请降温后使用。

▲ 点击查看不是坐在办公椅上的屁股都渴望自由,而是——最近天越来越热,屁股捂在椅子上,既不散热也不排汗,比戴口罩闷出痱子还难受,实在是坐不住。。最尴尬的就是站起来裤子时常黏在屁股缝里,难不成每次还要…

C# 正则表达式编写及验证方法

01—前言正则表达式应用很广泛,应该大多人都接触过了,这个语法规则既多又凌乱,每次用的时候都得重新看一遍语法,真的是让人头疼啊!但是实际上我们并不要掌握很多的符号用法规则,牢记最常用的几个就能应付很…

Domino Web开发规则之二:DOMINO与开发相关的管理规范

1.服务器HTTP优化设置 调整活动线程数&#xff0c;HTTP服务器可以同时处理的请求数&#xff0c;而非连接数、会话数 单CPU服务器<64 多CPU服务器<80 并发运行Web代理 确保Web代理是线程安全的情况下&#xff0c;可以启用来提高性能。 服务器文档-> Internet协议 ->…

老师一定没有教!9个数学速算技巧!看到第1个就跪了!

全世界只有3.14 % 的人关注了寄语 与世界上的其他学科一样&#xff0c;数学也有自己的奇妙之处。由于各种各样的原因&#xff0c;老师没有将这些秘密告诉我们。下面就是一些有趣的数学技巧&#xff0c;看完后你也许会爱上这门学科。▼不管是几个1的平方&#xff0c;都是有规律…

愚蠢的领导才会用程序员祭天!!

“人非圣贤&#xff0c;孰能无过网络上频频流出程序员误删线上数据库&#xff0c;造成XX公司XX万损失的新闻&#xff0c;进而牵扯出“杀一个程序员祭天”的妙语&#xff0c;虽然杀一个程序员比杀一个进程要难很多&#xff0c;但也充满着讽刺的味道。程序员每天都往返于代码和服…

一般将来时语法课教案_速看,如何在考场写出一篇脱颖而出的教案

面试最重要的考试环节就是试讲&#xff0c;而想要进行一次优秀的表演&#xff08;试讲&#xff09;&#xff0c;则需要一个过硬的剧本&#xff08;教案&#xff09;&#xff0c;那我们如何写出一篇完美教案呢&#xff1f;今天上元教师就教给大家10分钟速写一份教案的方法&#…

你的感情路不顺么?

1 你的感情路不顺么&#xff1f;2 扎心了&#xff01;3 哈哈哈哈没毛病&#xff0c;差一点就信了&#xff01;4 这个反杀&#xff0c;满分&#xff01;5 一只认认真真学揉面的猫咪6 当你妈说你该出门运动下的时候。。 你点的每个赞&#xff0c;我都认真当成了喜欢

在zabbix中添加监控主机及Items

在http://ly36843.blog.51cto.com/3120113/1640289我们学习了zabbix的server和agent的编译安装方法 这里我们添加监控主机和监控一、添加一个主机填写监控主机的相关选项主要填写&#xff1a;主机名称&#xff0c;选择哪个组即可查看添加后的结果二、添加Items从上面的结果中我…

WPF实现聚光灯效果

WPF开发者QQ群&#xff1a; 340500857 | 微信群 -> 进入公众号主页 加入组织欢迎转发、分享、点赞、在看&#xff0c;谢谢~。 前言效果仿照 CSS聚光灯效果 https://www.jianshu.com/p/6eae322e8e3801—效果预览更多效果请下载源码体验一、SpotLight.cs 代码如下using Syst…

托管PE文件

文/玄魂 中间语言 在.NET框架中&#xff0c;公共语言基础结构使用CLS来绑定不同的语言。通过要求不同的语言至少要实现CTS包含在CLS中的部分&#xff0c;公共语言基础结构允许不同的语言使用.NET框架。因此&#xff0c;在.NET框架中&#xff0c;所有的语言&#xff08;C#、VB.N…

带你见识不一样的世界,这5部豆瓣纪录片不可错过!

全世界只有3.14 % 的人关注了爆炸吧知识纪录片一直都是增长见识又带给你力量的东西&#xff0c;你可能忙于学业、生活、工作而不能行万里路&#xff0c;但至少你还可以看纪录片&#xff0c;从一方屏幕看到整个世界。今天就为大家整理了5部高分纪录片&#xff0c;文末附领取方式…

客户要求ASP.NET Core API返回特定格式,怎么办?(续)

前言上次&#xff0c;我们用客户就要求API的返回值属性名必须是PascalCase&#xff08;如UserName&#xff09;&#xff0c;但是这些API需要同时提供给内部系统使用&#xff0c;默认都是CamelCase&#xff08;如userName&#xff09;。其实&#xff0c;返回的都是JSON格式&…

网吧也用VDI?

升级360以后&#xff0c;挨个菜单都点了一遍&#xff0c;虽然没啥用处&#xff0c;清清垃圾&#xff0c;升级下软件&#xff0c;清理下启动项还是很不错滴。 清理启动项的时候就搞笑了&#xff0c;发现Citrix联机插件居然被360识别为网吧无盘工作站连接中心。ICA Client我想了好…

知乎超高赞:见识多的人,平时都在看些什么?

全世界只有3.14 % 的人关注了爆炸吧知识微信新功能总在悄咪咪更新&#xff0c;“拍一拍”一出&#xff0c;很多小伙伴都会收到各种群里面千奇百怪的“拍一拍”&#xff0c;到底都是谁在偷偷关注你&#xff1f;真正决定人与人之间的差距的&#xff0c;其实是我们对事物的见识与内…

究竟是什么可以比反射还快实现动态调用?| Source Generators版

前言最近在公众号上看到一篇文章《究竟是什么可以比反射还快实现动态调用&#xff1f;》&#xff0c;它使用的是Newbe.ObjectVisitor&#xff0c;基于C#表达式树访问一个普通class的所有属性和对应的值&#xff0c;可以拥有比直接使用反射快上10倍的性能。就这一需求来说&#…

只要懂得拒绝,哪会有什么狗血感情与莫名其妙的误会

1 就凭你&#xff1f;也想握朕的手&#xff1f;2 来&#xff0c;快站好~抱好娃&#xff01;拍全家福啦&#xff01;3 自我约束有利于家庭和谐&#xff0c;嗯&#xff01;4 问题来了&#xff0c;你是夜灯党还是漆黑党&#xff1f;你点的每个赞&#xff0c;我都认真当成了喜欢

android笔记之在WebView中显示ProgressBar的两种方法

http://blog.csdn.net/liuzhidong123/article/details/6450334 本文基于Creative Commons Attribution 2.5 China Mainland License发布&#xff0c;欢迎转载&#xff0c;演绎或用于商业目的&#xff0c;但是必须保留本文的署名http://www.cnblogs.com/luminji&#xff08;包含…

绝对不能错过!2009~2019 高中数学联赛11年真题解析

全世界只有3.14 % 的人关注了爆炸吧知识参加过高中数学联赛的同学都知道&#xff0c;全国高中数学联赛作为中国数学会及各省、市、自治区数学会的一项经常性工作&#xff0c;是属于较高等级的数学竞赛&#xff0c;其地位远高于各省自行组织的数学竞赛。为什么这个竞赛会这么特别…

在Win7中怎样打开摄像头?

在Win7中怎样打开摄像头&#xff1f;标题所说的问题在我装了win7后也遇到了&#xff0c;当时我也只会用等下我说的第一个方法打开摄像头&#xff0c;不过幸运的是我在前些天了解到了另外一个方法&#xff0c;那么现在我先讲下这个问题出现的原因吧&#xff1a;在Win7推出后就因…