Reids分布式锁引用在redis集群+哨兵部署模式下可能会造成主从切换时丢锁的情况,即当客户端A从master获取锁成功时,master挂机,实现主从切换,但是锁还没有来的及同步到新的master时【异步复制】,恰好客户端B从master执行获取锁操作,所以也能够获取到锁,从而导致AB客户端同时操作共享资源,造成丢锁。
这种情况可以采用集群模式+Redlock实现高可靠的分布式锁来解决,他的基本思路就是通过改用多个独立的redis服务器或者redis Cluster集群,在客户端获取锁时先计算当前时间,然后设置过期时间,并取其中比如几十毫秒用作获取锁的过期时间,在获取锁时会依次向独立服务器获取,如果过半数获取成功,并且获取时间小于设定的过期时间,那么获取成功,否则获取失败,无论成功与否最后会向所有redis服务器或者集群解除锁。
其实在Redission中已经实现了Redlock的支持,只需要为每个redis服务器创建一个RedissonClient实例,然后将他们一起构造成一个RedissonRedLock对象,之后调用tryLock方法即可,然后设置过期时间和锁失效时间,无论如何最后要调用unlock方法解锁。
另外redis普通分布式锁需要自己加唯一标识,在Redlock中则是通过UUID+threadId实现的。