根据setnx的结果来判断是否是获取到锁,是就执行减库存的操作,不是则返回网络错误<br>
lock_key = 'lock_key'<br>res = conn.setnx(lock_key, 'lock')<br>if not res:<br> return '网络错误'<br><br># ... 减库存逻辑<br><br>conn.delete(lock_key)<br>return msg<br>
当在执行删除key的操作前,程序异常退出了,后面的请求永远不会执行到减库存的逻辑<br>
try…finally来解决<br>
lock_key = 'lock_key'<br>res = conn.setnx(lock_key, 'lock')<br>if not res:<br> return '网络错误'<br><br>try:<br> # ... 减库存逻辑<br>finally:<br> conn.delete(lock_key)
除了程序异常退出,还可能机器宕机,这样异常就捕获不到了,这是就需要给key设置一个过期时间<br>
等到过期时间到后key就会被redis销毁掉,不会影响其他的请求
lock_key = 'lock_key'<br>res = conn.setnx(lock_key, 'lock')<br>conn.expire(lock_key, 10)<br>if not res:<br> return '网络错误'<br><br>try:<br> # ... 减库存逻辑<br>finally:<br> conn.delete(lock_key)<br>
设置过期时间的代码和设置锁值的代码应该使用原子性来执行<br>
conn.set(lock_key, 'lock', nx=True, ex=10)
考虑在加了超时的情况下,业务还没执行完,但锁超时间已到<br>
子主题<br>
当前请求1的处理库存逻辑需要12秒,还没执行完,锁就失效了
请求2获得了锁后,开始处理逻辑,请求2执行了2秒后,请求1处理完毕,删除了锁,但是这个锁是请求2的锁
请求3,不等到请求2释放锁,在第12秒时就可以获得锁
然后请求2会会再把请求3的锁提前释放掉
针对这种问题,我们需要对判断要删除的锁是不是自己创建的