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协议 ->…

python从入门到爬虫_python爬虫从入门到放弃(一)之初识爬虫

什么是爬虫&#xff1f;网络爬虫(又被称为网页蜘蛛&#xff0c;网络机器人&#xff0c;在FOAF社区中间&#xff0c;更经常的称为网页追逐者)&#xff0c;是一种按照一定的规则&#xff0c;自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟…

Linq-语句之Select/Distinct和Count/Sum/Min/Max/Avg

上一篇讲述了LINQ&#xff0c;顺便说了一下Where操作&#xff0c;这篇开始我们继续说LINQ to SQL语句&#xff0c;目的让大家从语句的角度了解LINQ&#xff0c;LINQ包括LINQ to Objects、LINQ to DataSets、LINQ to SQL、LINQ to Entities、LINQ to XML&#xff0c;但是相对来说…

【HDU】2795 Billboard

1 #include<cstdio>2 #define MAXN 2000103 #define MIN(a,b) ((a)>(b)?(b):(a))4 #define MAX(a,b) ((a)>(b)?(a):(b))5 int w,tree[MAXN<<2];6 inline void PushUp(int rt)7 {8 tree[rt]MAX(tree[rt<<1],tree[rt<<1|1]);9 } 10 void Bui…

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

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

Java类的继承总结

本文主要是讲述Java类的继承&#xff0c;更多Java技术知识&#xff0c;请登陆疯狂软件教育官网。加疯狂软件官方微信号&#xff1a;fkitorg,免费赢大奖&#xff0c;有机会赢得iOS培训课程一套。  在生活中我们往往把许多东西归为一个整体&#xff0c;如球有篮球&#xff0c;足…

《程序员》杂志2011年第5期.pdf 下载链接 首发。

csdn《程序员》杂志2011年第5期.pdf 程序员 2011 5月刊 pdf 请下载后24H之后删除。购买原版。谢谢。 下载链接: http://ishare.iask.sina.com.cn/f/15850972.html

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

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

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

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

php smtp验证,php通过smtp验证登陆

内网的系统为了统一账号&#xff0c;都采用用邮件账号登陆的方式&#xff0c;所以有了以下程序/** * 通过邮件 验证登陆 * 这里要明白的是用户名是 带域名的&#xff1a;aaa163.com */ function valideEmailLogin($user, $pass, $smtp_server smtp.163.com, $port25) { $handl…

你的感情路不顺么?

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

小算法

重新看C语言时&#xff0c;一个小发现&#xff0c;在交换两个变量的值时&#xff0c;一般设个变量&#xff1a; int a 13, b 27; int c; c a; a b; b c; 还可以不用中间变量&#xff1a; a a b; b a - b; a a - b; 或&#xff1a; a a ^ b; b b ^ a; a a ^ b; …

在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…

python8皇后不攻击问题_Python八皇后问题(落最后一颗子)

最近在看Python基础&#xff0c;遇到了八皇后问题&#xff0c;看得整个人晕晕乎乎&#xff0c;甚至开始怀疑人生。问题是在一个8*8的国际象棋棋盘上摆放8个皇后&#xff0c;问题一是找出一个解&#xff0c;问题二是问有多少个解。这里我把我自己的理解写出来&#xff0c;只针对…

Could not find result map

"Exception: org.apache.ibatis.builder.xml.IncompleteStatementException: Could not find result map....." 在使用mybatis 3 和spring 3整合的时候&#xff0c;往往粗心的人会在过程中出现以上错误。--------------------------原因是: ***-mapper.xml文件中的 r…

php中unset面试题,php unset和引用——由一道php面试题引发的思考

$test"aaaaa";$abc&$test;unset($test);echo $abc;为什么结果会输出aaaaa呢&#xff0c;$test不是销毁了吗&#xff1f;$abc引用一个销毁的怎么输出的不是空白呢&#xff1f;查了下资料&#xff0c;将原因分析如下&#xff1a;变量存储数据时可以理解为变量的值放…