译自:redis官方文档
Redlock算法
在分布式版本的算法中,我们假设有N个Redis实例,这些节点是完全独立的,因此,我们不需要复制或任何其他的协调方法。在单机模式中,我们已经描述了怎样安全地取得和释放锁。我们认为Redlock算法在单机模式中将会使用这种方法去取得和释放锁是理所应当地。在我们地例子中N=5,这是一个合理地值,因此需要在5个不同的电脑或虚拟机上运行5个Redis实例以确保他们之间地相互独立。
为了取得锁,客户端执行以下操作:
1. 获取当前毫秒级时间Start。
2. 试着用相同的key和value顺序地对N个Redis实例进行加锁。该步骤中,在为每个实例设置锁的同时,客户端会使用一个超时时间timeout,timeout小于锁的自动释放时间ValidityTime。例如:如果ValidityTime=10s,则timeout应该在5~50ms之间。这可以使一个实例宕机时,客户端阻塞的时间更短,当一个Redis实例不可达时,应该尽快的去对另一个实例加锁。
3. 获取当前毫秒级时间End, End - Start = Elapsed, Elapsed是客户端为了获得锁而花费的时间。当且仅当客户端在所有实例中取得的锁的个数占多数,并且花费的总时间Elapsed小于锁的有效时间,此时,才会认为加锁成功。
4. 如果加锁成功,锁的有效时间则是ValidityTime = InitTime-Elapsed,Elapsed如步骤3中计算。
5. 如果客户端由于某些原因加锁失败,如ValidityTime<=0 或者 n < N/2 + 1。此时,客户端将会对这些实例进行unlock操作。
算法是异步的么?
我们需要更好的说明这个排他锁的规则:只有当客户端在有效时间ValidityTime内完成工作才能保证该排他锁的有效性。