Redis 分布式锁-设置过期失效问题

项目背景:

       由于监控系统要每隔1分钟检测各个被监控的机器心跳,所以用了spring的定时器。由于是集群部署,所以需要解决重复执行定时器的问题。所以采用了分布式锁的方式,让定时器只被一个节点执行。
Redis分布式锁的实现
       采用Setnx命令和expire命令,实现分布式锁。但是近期发现定时器都没有被执行,查看redis锁的key值发现,这个key对应的value(项目中是直接设置成获取到锁的时间)一直没有更新,停留在4月21号,查的时候是4月25号。
       分析原因可能是在设置过期时间的时候项目突然被重启(测试环境),此时被设置的key值,没有设置对应的过期时间。导致造成死锁。
       分布式锁的实现也只是单纯靠过期时间来保证释放锁,这也是有问题,需要整改的地方。
       为了进一步了解redis的分布式锁的实现,先从基本命令着手:
       
 涉及Redis的基本命令:
       1,set key value;设置缓存值
       2,setnx key value; 只有key不存在才会设置对应的值,存在则不重置
       3,expire key time;  设置过期时间
       4,ttl key;查询key的过期时间还剩多久,当值为-1表示 key 存在且永久有效,-2则表是key不存在。
       注意:在 Redis 2.8 以前,当 key 不存在,或者 key 没有设置剩余生存时间时,命令都返回 -1 。

     如果在set 命令后设置 过期时间,在未过期期间又使用 set 命令重置 key值,此时被更新成功,同时过期时间失效,变成永久有效,需要再重新设置过期时间
  


整改Redis 分布式锁

      1,将设置key和过期时间放在同一个原子操作内。
    


      2,定时任务执行完毕之后要记得释放锁资源。
      释放锁资源也是需要考虑,如果定时任务的执行时间超过了过期时间后,分布式锁被另外的节点获取到,而被误释放的情况。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值