set locktarget 12345 ex 10 nx 如果业务代码执行时间大于设置的过期时间怎么处理
来源:4-4 如何实现分布式锁
qq_谁动了我的奶酪_03546962
2019-03-20
本来看完这节课,就联想到了当前项目中的一个现状,当前项目获取锁的方式是往数据库表中插入唯一主键,如果插入成功就获得锁,如果插入失败,就没有获得锁。等业务处理完之后再主动删除这条数据。但是这样存在的问题就是很容易造成死锁。
看到redis的这节课之后,我就立马茅塞顿开,第二天就去找领导说了我的想法,利用老师说的redis set locktarget 12345 ex 10 nx 获取锁并且可以设置超时时间的方案,想替代现有的实现方式。结果领导问了句,业务代码执行时间大于设置的过期时间怎么处理?怎么保证在设置的时间内执行完业务代码?当时就傻眼了。。。。好尴尬。
2回答
-
同学请不要给自己的问题回复,不然我这边很难发现。还是这个问题,还是需要根据你的业务需求来。这里方法很多,短短的篇幅没办法讲得仔细,需要同学课下调研。
如果业务觉得当前执行超过10秒是合理的,那么可以在调大过期时间,在过期时间内执行完成后,主动释放key;如果当前执行超过10秒是不合理的,应该让给其他程序来做,那么此时就可以中断程序,回滚,让出锁来,让别的程序执行,并做好日志记录
112019-03-21 -
qq_谁动了我的奶酪_03546962
提问者
2019-03-20
如果在set locktarget 12345 ex 10 nx 返回ok获取到锁之后,开始执行业务代码,在业务代码中穿插再给这个key重新设置过期时间,直到业务代码都执行完,再给这个key过期时间设置成0来释放锁,不知道这个方案是否还有漏洞?请老师帮忙解答一下,我好再去跟领导掰扯掰扯。。。得先做好准备,不能再像上一次那样找他,被他说的好尴尬。。
142019-03-22
相似问题