Redis分布式锁

redis是一种常用的实现分布式锁的方式,最简单的方式是setnx的方式,成功就加锁。 但是这种方式也有不少问题,比如没有不是可重入的,或者解锁的时候解错锁等等问题,或者redis一主一从, 主从同步时主挂掉,但是lock的key还没有迁移,这时锁就丢了。因此对于锁要求程度比较高的时候不能简单用这种方式

比如在加锁的时候,value也加上一个值,在解锁的时候要先根据value判断这个锁属不属于自己,属于自己才解锁。

Redis官方推荐一中Redlock的加锁算法。redisson基于这种算法已经有了实现,redlock宣称有这几种特性,

  1. 安全,永远只有一个client可以拿到锁。 2. 避免死锁,即使持有锁的client挂掉或者网络抖动。 3. 容错,只要大部分Redis节点存活就可以正常提供服务。

大致步骤如下:起redis节点若干(最好是奇数),client在所有redis节点上申请锁, value是一个随机值。当client在大于一半节点上申请成功时,计算一下申请锁消耗的时间,如果消耗时间小于锁的 持续时间,就认为加锁成功。 且锁生效的时间是要减掉消耗的时间。如果client申请失败,它会在已经申请成功的节点上执行释放操作。

解锁就是在所有节点上删除键即可。

Written on January 16, 2019