请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

set locktarget 12345 ex 10 nx 如果业务代码执行时间大于设置的过期时间怎么处理

本来看完这节课,就联想到了当前项目中的一个现状,当前项目获取锁的方式是往数据库表中插入唯一主键,如果插入成功就获得锁,如果插入失败,就没有获得锁。等业务处理完之后再主动删除这条数据。但是这样存在的问题就是很容易造成死锁。
看到redis的这节课之后,我就立马茅塞顿开,第二天就去找领导说了我的想法,利用老师说的redis set locktarget 12345 ex 10 nx 获取锁并且可以设置超时时间的方案,想替代现有的实现方式。结果领导问了句,业务代码执行时间大于设置的过期时间怎么处理?怎么保证在设置的时间内执行完业务代码?当时就傻眼了。。。。好尴尬。

正在回答

2回答

翔仔 2019-03-21 01:17:45

同学请不要给自己的问题回复,不然我这边很难发现。还是这个问题,还是需要根据你的业务需求来。这里方法很多,短短的篇幅没办法讲得仔细,需要同学课下调研。

如果业务觉得当前执行超过10秒是合理的,那么可以在调大过期时间,在过期时间内执行完成后,主动释放key;如果当前执行超过10秒是不合理的,应该让给其他程序来做,那么此时就可以中断程序,回滚,让出锁来,让别的程序执行,并做好日志记录

1 回复 有任何疑惑可以回复我~
提问者 qq_谁动了我的奶酪_03546962 2019-03-20 21:55:05

如果在set locktarget 12345 ex 10 nx 返回ok获取到锁之后,开始执行业务代码,在业务代码中穿插再给这个key重新设置过期时间,直到业务代码都执行完,再给这个key过期时间设置成0来释放锁,不知道这个方案是否还有漏洞?请老师帮忙解答一下,我好再去跟领导掰扯掰扯。。。得先做好准备,不能再像上一次那样找他,被他说的好尴尬。。

1 回复 有任何疑惑可以回复我~
  • 这个问题,
    个人理解:本质上来说的问题点就是一个客户端的阻塞,假设有两个可无端AB ,A获取锁成功设置时间成功,在执行某个请求的时候客户端执行业务逻辑的时间>锁的过期时间,从而导致B获取了锁,而A业务逻辑执行完后,释放了锁,此时A释放的锁为B持有的锁,针对这个问题,我们有必有给不同的客户端的锁设置不同的value值,就是避免客户端释放的锁不是自身所持有的。这时候的业务流程就变成了 setnx--》执行业务--》get锁Value--》判断value是否为当前客户端所持有的锁--》是执行 del指令 ,不是 不释放(也就是客户端卡顿,你所描述的问题),针对这个问题  ,我所了解的知识里面没有很好的实现的方式,只能根据自己的业务需求 设置锁的时间从而避免该问题的产生。 qq1173724284  本人最近也在思考分布式锁的问题
    回复 有任何疑惑可以回复我~ 2019-03-21 09:32:58
  • 解决措施有了:Redisson框架 或者双重防止机制
    回复 有任何疑惑可以回复我~ 2019-03-21 10:21:43
  • 感谢您的热心回答,受教了
    回复 有任何疑惑可以回复我~ 2019-03-21 20:26:33
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信