Bootstrap

学习小记 -- Redis的RedLock算法

RedLock算法是Redis集群中用的分布式锁算法,在讲之前先简单回顾一下在单Redis节点中分布式锁的使用原理:

我们都知到,用Redis可以实现分布式锁,在单Redis节点中,分布式锁通常使用

SET lock_key NX PX 5000

  • NX 代表只在键不存在时,才对键进行设置操作。
  • PX 5000 设置键的过期时间为5000毫秒。

但是会有问题,如果Client向Master获取锁之后同步给Slave,如果Client获取锁成功之后Master节点挂掉,并且未将该锁同步到Slave,之后在Sentinel的帮助下Slave升级为Master但是并没有之前未同步的锁的信息,此时如果有新的Client要在新Master获取锁,那么将可能出现两个Client持有同一把锁的问题。所以为了解决这个问题,可以设置一个唯一值random_value,用来校验自己的锁只能自己释放:

SET lock_key random_value NX PX 5000

  • random_value 是客户端生成的唯一的字符串。 

Redlock算法原理,是在分布式环境中,假如有N个独立的节点,在每个节点上使用的方式跟单节点一样。

RedLock算法要求:

  1. 客户端获取一个锁,需要向超过半数的节点获取锁,只有在了超过半数节点获取锁成功后,才算获取成功,这个过程是有时间损耗的。
  2. 过期时间(TTL) > 业务执行时间 + 加锁时间 + 始终漂移时间 
  3. 加锁失败后,要有重试次数限制。
  4. 若master挂了,master要延迟启动,可延迟TTL时间。

参考:https://zhuanlan.zhihu.com/p/101216704

;