Redis 分布式锁实现

1.先去redis中使用 setnx key value

2.发现redis里头有数据,说明已经加锁了

3.发现redis里头没有数据,说明可以获得锁

4.使用redis del key

5.锁超时 java 调用redis expire设置超时时间,自动删除key

 

三大致命问题:

1)非原子性操作

       setex 宕机了 expire用不了

解决思路:set(key,value,exprie)是原子性操作 redis2.6版本以上才支持

 

2)误删锁

     set(key,value,30),在30秒时间内,程序未操作完成,锁删了

解决思路:删除锁之前,先判断是不是自己的锁;set(key,value,exprie)让velue为线程id

3)基于第二个问题之上

   jvm1判断是否处理完成,jvm1处理完数据后才能释放锁,jvm1增加守护线程;

 

补充:  在没有获取到锁的情况下,提示获取锁失败

守护线程小知识:只要当前JVM实例中尚存在任何一个非守护线程没有结束,守护线程就全部工作;只有当最后一个非守护线程结束时,守护线程随着JVM一同结束工作,守护线程拥有自动结束自己生命周期的特性,而非守护线程不具备这个特点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑口罩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值