Redis中设置了过期时间的Key,有哪些需要注意的事项?

Visionpro 使用CogPMAlignTool工具提取匹配轮廓点 【代码】Visionpro 使用CogPMAlignTool工具提取匹配轮廓点。 阅读详情
熟悉Redis的同学应该知道,Redis的每个Key都可以设置一个过期时间,当达到过期时间的时候,这个key就会被自动删除。

 

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

1.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

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

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

(1)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

(2)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

1.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

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没设置过期时间这种情况。

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

(1)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)

(2)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)

1.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。

02 Redis的过期策略

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

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

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

2.1 懒惰删除

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

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

2.2 定期删除

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

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

  • 从过期字典中随机20个key
  • 删除这20个key中已过期的
  • 如果超过25%的key过期,则重复第一步

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

 

 

 

 

 

Open Lovable 网站克隆AI工具超详细实战教程(含环境配置、排错与代码修改) 本教程面向有一定计算机基础的新手用户,提供一份全面、深入的 Open Lovable 使用指南。从开发环境搭建、API密钥获取、项目部署到网站克隆、代码下载、本地运行与二次开发,涵盖全流程细节与常见问题解决方案。通过本教程,新手可掌握如何利用AI驱动的Open Lovable工具,将任意目标网站智能复刻为结构清晰、可编辑的现代前端项目(React/Vite),实现快速原型开发与技术学习。 阅读详情

相关推荐

识别产品外观的合格软件_工业视觉工业质检视觉识别机器视觉视觉检测智能制造工业检测缺陷...

随着工业物联网技术的迅猛发展,掀起了以云计算、大数据、以及人工智能 AI 等信息技术正与传统工业深入融合,由此衍生的 “智能制造4.0” 理念,正在为全球工业带来深远变革。中国的制造业巨头也纷纷借此发力,向智能化、数字化制造演进,实施战略转型。如何高效科学的管理和分析制造业务链上的生产价值,推进制造企业生产工艺优化与产品质量提升是每一个制造企业在数字化、智能化转型过程中的必经之路。业务发展带来的挑...

weixin_42502419的博客 754

、如果有大量的 key 需要设置同一时间过期,一般需要注意什 么

如果大量的 key 过期时间设置的过于集中,到过期的那个时间点,Redis 可能 会出现短暂的卡顿现象。一般需要在时间上加一个随机值,使得过期时间 分散 一些

weixin_40426261的博客 476

机械工程师如何用Codex实现CAD自动化:从重复劳动到智能设计

在机械设计领域,CAD二次开发长期面临学习门槛高、维护成本大的难题。随着AI编程助手如Codex的出现,通过自然语言生成可执行代码,工程师无需精通编程即可实现图纸批量处理、BOM表自动生成、参数化建模等任务。这种技术将重复性操作自动化,显著提升设计效率,让工程师聚焦于核心创新。应用场景涵盖批量修改图纸属性、跨软件数据流转、自动打印等。本文分享机械工程师利用Codex落地自动化的实战经验与避坑指南。

weixin_32296621的博客 366

Redis命令设置过期时间 redis设置过期时间的方法

Redis命令设置过期时间 redis设置过期时间的方法

weixin_42113716的博客 1532

windows10 + wsl2安装docker

一、安装wsl https://docs.microsoft.com/zh-cn/windows/wsl/install-win10 1.1以管理员身份运行powershell 1.2执行如下命令 dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart 1.3重启电脑 1.4 重启电脑后,如果需要安装wsl2, 则安装官方文档继续后续操作,因我...

happytree001的博客 1571

西门子PLC新手必看:200SMART与1200/1500的MODBUS RTU通讯实战(附完整配置流程)

本文详细解析了西门子PLC中S7-200 SMART与S7-1200/1500之间实现MODBUS RTU通讯的完整实战流程。内容涵盖硬件接线、软件配置及程序编写,重点讲解了200SMART作为从站、1200/1500作为主站的典型架构,并提供了关键功能块的使用方法和常见问题排查技巧,帮助新手快速打通不同系列PLC间的数据交换。

weixin_29214559的博客 400

ValueOperations<String, Object> ValueOperations = redisTemplate.opsForValue();中ValueOperations的所有方法详

ValueOperations ValueOperations = redisTemplate.opsForValue();中ValueOperations的所有方法详细

不太聪明qtfj的博客 1881

Opencv4.5.1 微信二维码识别功能 QRCode 编译与使用 C++

部分参考:https://mp.weixin.qq.com/s/2GZAJAUPHTXFOKDRv-D21Q 一、下载源码 https://github.com/opencv 二、源码编译 ① 在cmake中添加源码编译路径和生成路径,第一次点击configure。 ② 添加contrib路径 第一次configure后,找到OPENCV_EXTRA_MODULES_PATH,将contrib路径添加进来,注意要具体到modules/,继续configure。 ..

zaibeijixing的专栏 1万+

redis的incr可以设置过期时间吗

Redis的incr命令可以设置过期时间吗? Redis是一个快速、开源、高性能的键值存储数据库,常用于缓存、队列等应用场景。在Redis中,incr是一个常用的命令,用于对一个键的值进行自增操作。但是,很多人可能会疑惑,incr命令能否设置过期时间呢?让我们来探讨一下这个问题。 incr命令简介 incr命令用于对存储在...

weixin_36636291的博客 1626

【100%通过率】华为OD机试真题 Java&Go 实现【微服务的集成测试】【2023 Q1 | 100分】

现在有n个容器服务,服务的启动可能有一定的依赖性(有些服务启动没有依赖),其次服务自身启动加载会消耗些时间。给你一个nxn 的二维矩阵 useTime,其中 useTime=10 表示服务i自身启动加载需要消耗10s,useTimeli[j]=1 表示服务i 启动依赖服务i 启动完成,useTimei[k]=0,表示服务i 启动不依赖服务 k其实 0

MISAYAONE的博客 1万+

初探802.11协议(6)——Wi-Fi 6新特性简介

Wi-Fi 6新机制(特性)介绍

FanFF的博客 1523

分布式环境下解决redis过期监听事件重复监听的解决方案

最近项目中用到了redis数据过期监听的功能,当单机的时候,很完美的完成了业务要求,但是,一上集群,就产生了恶心的问题,它会产生广播效应,显然这不是我们想要的结果,我们只希望集群中某一个工程去监听这个过期事件然后进行下一步操作。 下面介绍一下我们在解决这个问题时锁采取的方式: 方案:利用redis的getset 命令方法进行解决; 思路是:在过期回调事件中利用getset设置 [ key(当前监听到的过期key)+".lock"作为新的key ],字符串"1"作为value,当某一个工程...

YHJ 2482

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Redis设置了过期时间key的注意事项和过期策略

一、在为key设置过期时间需要注意的事项 1. DEL/SET/GETSET等命令会清除过期时间 在使用DEL、SET、GETSET等会覆盖key对应value的命令操作一个设置了过期时间的key的时候,会导致对应的key的过期时间被清除。 //设置mykey的过期时间为300s 127.0.0.1:6379>setmykeyhelloex300 OK //查看过期时间 127.0.0.1:6379>ttlmykey (integer)294 //使用set命令覆盖myk...

程序员博客 1091

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

中的persist_Redis中设置了过期时间的Key,有哪些需要注意的事项?

熟悉Redis的同学应该知道,Redis的每个Key都可以设置一个过期时间,当达到过期时间的时候,这个key就会被自动删除。01 为key设置过期时间需要注意的事项1.1 DEL/SET/GETSET等命令会清除过期时间在使用DEL、SET、GETSET等会覆盖key对应value的命令操作一个设置了过期时间的key的时候,会导致对应的key的过期时间被清除。//设置mykey的过期时间为300s...

weixin_39574388的博客 141

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

c# redis hashid如何设置过期时间_Redis中设置了过期时间的Key,有哪些需要注意的事项?...

熟悉Redis的同学应该知道,Redis的每个Key都可以设置一个过期时间,当达到过期时间的时候,这个key就会被自动删除。01 为key设置过期时间需要注意的事项1.1 DEL/SET/GETSET等命令会清除过期时间在使用DEL、SET、GETSET等会覆盖key对应value的命令操作一个设置了过期时间的key的时候,会导致对应的key的过期时间被清除。//设置mykey的过期时间为300s...

weixin_39620370的博客 343

在Redis中设置了过期时间的Key注意事项

作者:千山qianshan juejin.im/post/5d6bda096fb9a06acc009dc8 熟悉Redis的同学应该知道,Redis的每个Key都可以设置一个过期时间,当达到过期时间的时候,这个key就会被自动删除。 在为key设置过期时间需要注意的事项 1、 DEL/SET/GETSET等命令会清除过期时间 在使用DEL、SET、GETSET等会覆盖key对应value的命令操作一个设置了过期时间的key的时候,会导致对应的key的过期时间被清除。 //设置mykey的过期时间为300s

qq_40907977的博客 299

添加key_【干货】在Redis中设置了过期时间的Key怎么办?

关注我,你的眼睛会怀孕熟悉Redis的同学应该知道,Redis的每个Key都可以设置一个过期时间,当达到过期时间的时候,这个key就会被自动删除。在为key设置过期时间需要注意的事项1、 DEL/SET/GETSET等命令会清除过期时间在使用DEL、SET、GETSET等会覆盖key对应value的命令操作一个设置了过期时间的key的时候,会导致对应的key的过期时间被清除。//设置my...

weixin_42516600的博客 692

c# redis hashid如何设置过期时间_在Redis中设置了过期时间的Key,需要注意哪些问题?...

作者:千山qianshan来源:https://juejin.im/post/5d6bda096fb9a06acc009dc8上一篇文章我们讲到了Redis的内存淘汰策略,这次跟我一起看一下Redis的过期策略。熟悉Redis的同学应该知道,Redis的每个Key都可以设置一个过期时间,当达到过期时间的时候,这个key就会被自动删除。在为key设置过期时间需要注意的事项1、 DEL/SET/GET...

weixin_39820177的博客 172

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

作者:千山qianshan来源:https://juejin.im/post/5d6bda096fb9a06acc009dc8上一篇文章我们讲到了Redis的内存淘汰策略,这次跟我一起看一下Redis的过期策略。熟悉Redis的同学应该知道,Redis的每个Key都可以设置一个过期时间,当达到过期时间的时候,这个key就会被自动删除。在为key设置过期时间需要注意的事项1、 DEL/SET/GET...

weixin_31211703的博客 137

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

点击上方“方志朋”,选择“设为星标”回复”666“获取新整理的面试文章作者:千山qianshanjuejin.im/post/5d6bda096fb9a06acc009dc8熟悉Redis...

方志朋的博客 145

redis如何设置定时过期_Redis 设置过期时间注意事项

在为key设置过期时间需要注意的事项1、 DEL/SET/GETSET等命令会清除过期时间在使用DEL、SET、GETSET等会覆盖key对应value的命令操作一个设置了过期时间的key的时候,会导致对应的key的过期时间被清除。//设置mykey的过期时间为300s127.0.0.1:6379> set mykey hello ex 300OK//查看过期时间127.0.0.1:6379...

weixin_39989668的博客 1018

redis如何设置定时过期_Redis-设置Key的过期时间及相关策略

部分内容转载自:1、设置key的过期时间1.1expire key second:设置key的过期时间(秒)127.0.0.1:6379> expire key1 100 key1在100秒后过期(integer) 11.2ttl key:查看key的有效期127.0.0.1:6379> ttl key1(integer) 73 大于0,还剩余多少秒存活时间127.0.0.1:6379...

weixin_39870700的博客 2628

【Redis实战】生产中使用Redis的一些注意事项

功能,这是由客户端提供的API,它可以一次性传一批命令给到服务端,从而减少了客户端与服务端的交互次数,避免了网络消耗的问题,当然批命令在使用时也要注意,批量的命令也不是无上限的,其不能超过缓冲区的大小,还要注意一次传入过多的命令也必然会造成服务端执行时间较长,造成阻塞问题。Key的集中过期对于Redis来说并没有什么影响,主要还是在业务上可能会因为大量Key的集中失效,导致在失效那一时刻,如果存在大量访问,则会对数据库带来巨大的压力,所以一般情况下,可以在失效时间上加上毫秒级别的随机数。

自律使我自由 1334

Redis过期策略,Redis的Key自动删除,Redis中的 EXPIRE 使用

熟悉Redis的同学应该知道,Redis的每个Key都可以设置一个过期时间,当达到过期时间的时候,这个key就会被自动删除。这就是Redis的过期策略。 在为key设置过期时间需要注意的事项 1、 DEL/SET/GETSET等命令会清除过期时间 在使用DEL、SET、GETSET等会覆盖key对应value的命令操作一个设置了过期时间的key的时候,会导致对应的key的过期时间被清除。 ...

shuizimuzhonglingf的博客 5309

使用Redis的五个注意事项(命名)

下面内容来源于Quora上的一个提问,问题是使用Redis需要避免的五个问题。而回答中超出了五个问题的范畴,描述了五个使用Redis的注意事项。如果你在使用或者考虑使用Redis,可能你可以学习一下下面的一些建议,避免一下提到的问题。 回到顶部 1.使用key值前缀来作命名空间 虽然说Redis支持多个数据库(默认32个,可以配置更多),但是除了默认的0号库以外,其它的都需要通过

xiaoyangsavvy的专栏 2325

Redis设置key过期时间

expire(key,seconds),其中seconds单位为 s容易混淆的有这两种:existss(key),检查key是否存在,存在返回1hexistx(key,field)查看哈希中key中的field是否存在

weixin_41113108的博客 1587
上一篇: 聊聊java中一些减少if-else 的编码方式!
下一篇: 10种阻碍程序员职业生涯发展的行为,你有吗?
加班不秃顶
博客等级 码龄7年 1822粉丝 599原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值