Redis的SET命令 在生产环境下发生的一次严重事故

这篇具有很好参考价值的文章主要介绍了Redis的SET命令 在生产环境下发生的一次严重事故。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

今天给大家分享的是Redis基础命令set过期时间被覆盖问题。该命令可能是大家最为常见的一个命令,但有一个小细节可能很多人多都没注意到,今天就来演示总结一下。

该细节虽然看着很小,平常也很少关注到这点。但在实际的生产环境发生过一次,对于一些流量大的应用尤其需要注意。

场景演示

首先我们按照常规的操作,向Redis中插入一个值。示例代码如下:

127.0.0.1:6379> set demo kert ex 100
OK
127.0.0.1:6379> ttl demo
(integer) 87

上面的命令不难看出,向Redis中插入了一个string类型的值,key为demo,值为kert,并且为其设置了一个过期时间。

接下来,我们对该key进行重新设值(update操作)。

127.0.0.1:6379> set demo bruce
OK

看到这里,我们先思考3秒钟,该key的过期时间是多少?

  • 过期时间可能是第一次设置时间
  • 永不过期

带着这两种疑问,我们看看实际的结果。

127.0.0.1:6379> ttl demo
(integer) -1

实际上结果变成了-1。-1是什么意思呢,在Redis中要查看某个key的过期时间,我们可以使用ttl命令。它会返回三种可能的值:

  • 如果为 >= 0 则是该key的剩余过期时间,返回的时间是秒(s),如果想返回毫秒,可以使用pttl
  • 如果为 -1 则是该key没有设置过期时间
  • 如果为 -2 则是该key不存在,可能是本身就不存在也有可能是该key已到过期时间,被Redis标记为过期的key

通过实际的演示,我们返现使用set命令时,会覆盖原本key的过期时间,并且将该key设置为永久不失效的key。

解决方案

要保持该key的过期时间,这里有两种方案:

  • 先获取该key的过期时间,如果设置了过期时间,重新赋值之后再对其设置过期时间
  • 使用Redis6.0版本之后的新命令参数,keepttl

第一种方案

示例代码如下:

127.0.0.1:6379> set demo bruce ex 100
OK
127.0.0.1:6379> ttl demo
(integer) 96
127.0.0.1:6379> set demo 7small7
OK
127.0.0.1:6379> ttl demo
(integer) -1
127.0.0.1:6379> expire demo 96
(integer) 1
127.0.0.1:6379> ttl demo
(integer) 93

上述代码,大致的逻辑就是先设置一个带过期时间的key,并且在重新赋值前,获取过期时间,重新赋值之后再对key设置原来的过期时间。

该方式有2个大的问题,过期key的时间差,以及多个命令执行的原子性。

第二种方案

上述第1种的解决方案存在两个问题,接下来我们使用官方提供的命令参数。

127.0.0.1:6379> set demo bruce ex 100
OK
127.0.0.1:6379> ttl demo
(integer) 96
127.0.0.1:6379> set demo 1111 keepttl
OK
127.0.0.1:6379> ttl demo
(integer) 82

通过上面的操作,可以看到key的过期时间还是原有的过期时间。并且命令属于原子性操作,不用担心某个命令操作失败的问题。

最后还需要注意一点:官方原本提供了SETNX, SETEX, PSETEX, GETSET等命令,但现在官方推荐不要使用这样的命令,在将来这些命令可能会被移除,而推荐是SET命令+参数的方式来实现。

Note: Since the SET command options can replace SETNX, SETEX, PSETEX, GETSET, it is possible that in future versions of Redis these commands will be deprecated and finally removed.

在这里我也总结了部分Redis的学习资料,感兴趣的可以进行学习,希望对你有所帮助。文章来源地址https://www.toymoban.com/news/detail-471396.html

  • Redis7系列教程入门
  • Redis网络模型到底有多强
  • 如何降低Redis的内容使用
  • 一线互联网大厂都是如何面试Redis的
  • 2022Redis大厂最新面试汇总-附带答案

到了这里,关于Redis的SET命令 在生产环境下发生的一次严重事故的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一次生产环境上的dockerd启动失败原因分析

    今夜原计划对 生产环境 上的 SDN 组件进行一次紧急扩容操作的,但业务基础环境中的 Docker-Engine 启动不起来了、原定计划也就无法继续进行了。 尽管查清了基础业务环境中的故障原因,但金主DD说今天先不干了,那就整理整理思路写篇流水账吧 。。。 现象如下: 1 ps -aux 查

    2024年03月10日
    浏览(61)
  • Redis List类型命令 - Set类型命令 - SortedSet类型命令

    目录 List类型 什么是双向链表呢? List类型的特征: List的常用命令 LPUSH和RPUSH的区别: LPOP和RPOP的区别: LPUSH和RPUSH的使用 LPOP和RPOP的使用 LRANGE key star end:返回一段距离范围内所有的元素 BLPOP和BRPOP:它在没有该元素的时候会等待一段时间,而不是直接返回nil 问题1:如何利

    2024年02月09日
    浏览(52)
  • Redis info命令生产监控和config配置命令

    info命令介绍:服务器的各种信息和统计数值 config命令介绍(都有默认值) 可以动态的调整Redis服务器的配置(configuration)而无需重启 config get xxx、config set xxx 常用配置:Redis常用配置文件 备注 maxmemory防止所用内存超过服务器物理内存,maxmemory限制的是Redis实际使用的内存量

    2024年01月15日
    浏览(35)
  • 创建TLS客户端凭据时发生严重错误,内部错误状态为10013

    Windows11操作系统运行iNode智能客户端在建立SSL VPN隧道连接时,系统日志频繁提示“创建 TLS 客户端 凭据时发生严重错误。内部错误状态为 10013”,虽然不影响使用,但是日志频繁报该错误还是比较烦的。 1、使用Windows+R快捷键打开运行窗口。 2、在运行窗口,输入control命令,

    2024年02月13日
    浏览(51)
  • 0x80070643-安装时发生严重错误/0x80096005 时间戳签名和/或证书无法验证或已损坏

    该问题是在win7-32位系统下安装.net4.8触发的错误,最后通过不断的尝试,发现和系统中存在的环境有较大的关系。 最后通过在控制中心软件卸载处找到旧版本.NET版本,卸载后管理员身份安装.net 4.8 解决问题。 通过网上寻找的教程,试过重新安装签名版,信任数字签名,均无

    2023年04月16日
    浏览(65)
  • Redis 数据类型及其常用命令一(string、list、set、zset、hash)

    1、简介         Redis 的常用数据类型有十种,分别为:string、list、set、zset、hash、geo、hyperloglog、bitmap、bitfield、stream。熟练使用各种数据类型,能够快速结合场景进行使用。 注:我们所说的数据类型是指 value 的数据类型,key 都是字符串。 所有类型的命令查看:help @数据类

    2024年03月13日
    浏览(58)
  • 宿主机无法连接docker里的redis问题解决(生产环境慎用)

    1.连接超时 2.连接能连上但马上断开并报错 3.提示保护模式什么的 链接redis 时只能通过本地localhost (127.0.0.1)这个来链接,而不能用网络ip(192.168…)这个链接 1.打开配置文件把下面对应的注释掉 2.Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进

    2024年04月13日
    浏览(60)
  • 生产环境Session解决方案、Session服务器之Redis

      目录 一、服务器配置 二、安装nginx 三、安装配置Tomcat:  四、配置session Session服务器之Redis Redis与Memcached的区别 安装部署redis IP地址 主机名 软件包列表 192.168.100.131 huyang1 nginx 192.168.100.133 huyang3 JDK Tomcat   192.168.100.135 huyang5 JDK Tomcat 浏览器访问测试 192.168.100.133:8080 和 192.1

    2024年02月15日
    浏览(52)
  • 一次严重的I2C信号错误

    制作电池电量计测试板,使用I2C信号与主板通信,中间连接20cm的2.54排线,两侧电平均为3.3V。 主板无法访问电量计芯片。 I2C信号波形如下: 半高电平的问题跟随示波器的通道2,有点匪夷所思,但是对排除信号线路问题有一定帮助。 解决问题的过程中参考了以下文章: 1、

    2024年02月12日
    浏览(43)
  • 记一次Redisson连接k8s环境Redis报UnknownHostException-域名解析错误问题解决

    一直听说Redisson分布式锁好用,终于在项目上使用了!在本地测试完毕,一上测试环境,运维就反馈服务没起来,拉日志一看,是以下报错 主要报错信息是 于是乎,上github看了一下,发现这还是一个比较热门dns解析失败的问题,好多人都遇到了同样的问题。想着开源项目,这

    2024年02月04日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包