Redis分布式锁原理解析

来源:互联网 发布:二手交易软件有哪些 编辑:程序博客网 时间:2024/06/07 12:38

一、Redis分布式锁的流程图

流程图
首先设置上锁的方式,用setnx(lockkey,currenttime+timout)来表示设置锁,其中lockkey为我们所需要争取到的锁,value值则由当前时间和设置的超时时间组成。
当我们争取到锁后,进行常规操作即可,接下来我们讨论竞争锁失败后的优化。

二、获取锁的优化判断

首先我们去得到lockkey的value值,接下来进入第一个判断条件:
若这个值不为空,且当前时间的值是大于这个数值的,则代表这个锁已经超时了,并可能之前获得锁的操作出现了异常(比如突然关掉Tomcat),导致redis中的锁expire值为-1,而没被释放,此时代表我是可以再次获取到锁的。

于是接着执行getset(lockkey.currenttime + timeout),重新设置锁的value值,此处用到getset将会返回旧值lockvalueB,是为了进一步确保锁的安全,比如又有其他Tomcat拿到锁了。
接着判断lockvalueB,
1. 若为空,代表lockkey已经没有了(可能是已经被释放),所以可以正常拿到锁;
2. 若跟lockvalueA相等,则代表在两个菱形判断条件过程中,没有其他服务过来争取锁,而lockkey是已经处于超时的状况,因而也可以正常去获取锁。
这样加双重判断就能有效防止死锁。