在Redis中设置了过期时间的Key,需要注意哪些问题?

熟悉Redis的设置时间同学应该知道,Redis的过期每个Key都可以设置一个过期时间,当达到过期时间的需注时候,这个key就会被自动删除。意问
在为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) -12、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) 277LPUSH:
//新增一个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) 2523、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) -14、使用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命令可以更新过期时间
对一个已经设置了过期时间的b2b供应网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数据量特别大的b2b信息网时候,使用keys * 命令列出所有的key。
实际上Redis使用懒惰删除+定期删除相结合的方式处理过期的key。
懒惰删除
所谓懒惰删除就是在客户端访问该key的时候,redis会对key的过期时间进行检查,如果过期了就立即删除。
这种方式看似很完美,在访问的时候检查key的过期时间,不会占用太多的额外CPU资源。但是如果一个key已经过期了,如果长时间没有被访问,那么这个key就会一直存留在内存之中,严重消耗了内存资源。
定期删除
定期删除的原理是,Redis会将所有设置了过期时间的key放入一个字典中,然后每隔一段时间从字典中随机一些key检查过期时间并删除已过期的key。
Redis默认每秒进行10次过期扫描:
从过期字典中随机20个key 删除这20个key中已过期的 如果超过25%的key过期,则重复第一步同时,为了保证不出现循环过度的情况,Redis还设置了扫描的时间上限,默认不会超过25ms。
参考资料
https://redis.io/commands/expire#expire-accuracy
相关文章
GHOSTwin11安装方法全解析(简单易懂的安装步骤,让您快速体验Win11的新特性)
摘要:Windows11作为微软最新推出的操作系统,备受期待。为了帮助用户更好地了解和安装GHOSTwin11,本文将详细介绍Win11的安装方法及相关注意事项,以便您顺利升级到这个全新...2025-11-05玛纽尔扫地机器人的优势和功能(让家庭清洁更轻松玛纽尔扫地机器人的全新体验)
摘要:在现代快节奏的生活中,家庭清洁是一个让人头疼的问题。然而,随着科技的不断进步,玛纽尔扫地机器人应运而生。它以其智能化的功能和优越的性能,成为了家庭清洁的得力助手。本文将对玛纽尔扫地...2025-11-05- 摘要:电脑在我们日常生活中扮演着重要的角色,存储着我们的个人隐私和重要数据。为了保护这些信息不被他人窥探或盗取,设置一个安全的电脑锁屏密码是必不可少的。本文将为您介绍一些关于电脑锁屏密码...2025-11-05
- 摘要:作为一款备受瞩目的智能手机,坚果Pro2凭借其出色的系统表现引起了广大用户的关注和喜爱。本文将就坚果Pro2的系统进行深入探讨,从各个方面介绍其卓越的性能和功能。全新系统U...2025-11-05
探索AMDFX-6120的性能优势(揭秘FX-6120处理器的卓越表现及应用领域)
摘要:随着科技的进步,处理器的性能对于计算机的运行速度和应用能力起着至关重要的作用。其中,AMDFX-6120处理器以其优异的性能和出色的应用表现备受关注。本文将详细探索FX-6120处...2025-11-05夏普无边框手机的性设计(领衔全球手机市场,夏普用无边框手机定义新时代)
摘要:在科技迅速发展的今天,手机已成为人们生活中不可或缺的一部分。而夏普作为一家知名的电子公司,通过创新设计推出了一款性的无边框手机,引领全球手机市场的新趋势。1.无边框设计...2025-11-05

最新评论