RedLock到底是个什么东西呢?
下文笔者将讲述RedLock的相关简介说明,如下所示:
此方式比原先的单节点的方法更安全,因为它拥有以下特性
当我们需获得锁,client 会进行如下操作:
此时需要稍等片刻再重试,采用此种方式可避免多个client同时申请锁的情况
--------------------------------------------------------------------------------
我们也可让一个client同时向5个master发起锁申请
此时如果 client 申请锁失败了它需要尽快在它曾经申请到锁的 master 上执行 unlock 操作
便于其他 client 获得这把锁
避免这些锁过期造成的时间浪费
当然如果这时候网络分区使得 client 无法联系上这些 master,那么这种浪费就是不得不付出的代价
RedLock简介
RedLock是:基于Redis实现分布式锁的方式此方式比原先的单节点的方法更安全,因为它拥有以下特性
- 安全特性:互斥访问,即永远只有一个 client 能拿到锁
- 避免死锁:最终 client 都可能拿到锁,不会出现死锁的情况,即使原本锁住某资源的 client crash 了或者出现了网络分区
- 容错性:只要大部分 Redis 节点存活就可以正常提供服务
Redlock算法实现简介
开启5个master节点,分布在不同的机房尽量保证可用性,当我们需获得锁,client 会进行如下操作:
- 得到当前的时间,微秒单位
- 尝试顺序地在 5 个实例上申请锁,当然需要使用相同的 key 和 random value,这里一个 client 需要合理设置与 master 节点沟通的 timeout 大小,避免长时间和一个 fail 了的节点浪费时间
- 当 client 在大于等于 3 个 master 上成功申请到锁的时候,且它会计算申请锁消耗了多少时间,这部分消耗的时间采用获得锁的当下时间减去第一步获得的时间戳得到, 如果锁的持续时长(lock validity time)比流逝的时间多的话,那么锁就真正获取到了
- 如果锁申请到了,那么锁真正的 lock validity time 应该是 origin(lock validity time) - 申请锁期间流逝的时间
- 如果 client 申请锁失败了,那么它就会在少部分申请成功锁的 master 节点上执行释放锁的操作,重置状态
失败重试
当一个client申请锁失败了此时需要稍等片刻再重试,采用此种方式可避免多个client同时申请锁的情况
--------------------------------------------------------------------------------
我们也可让一个client同时向5个master发起锁申请
此时如果 client 申请锁失败了它需要尽快在它曾经申请到锁的 master 上执行 unlock 操作
便于其他 client 获得这把锁
避免这些锁过期造成的时间浪费
当然如果这时候网络分区使得 client 无法联系上这些 master,那么这种浪费就是不得不付出的代价
放锁
放锁操作很简单,就是依次释放所有节点上的锁就行了版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。