分布式锁
作者:bin- 一、redis 分布式锁
上锁
redis.xiaoying.work:6379> SETNX lock_key random_value (integer) 1 redis.xiaoying.work:6379> expire lock_key 10 (integer) 1
等同于
SET lock_key random_value NX PX 1000
random_value 是客户端生成的唯一的字符串,避免删除时删到别人设置到锁
NX 代表只在键不存在时,才对键进行设置操作。
PX 5000 设置键的过期时间为5000毫秒。
解锁我们借助(LUA脚本)完成:
if redis.call('get',KEYS[1]) == ARGV[1] then return redis.call('del',KEYS[1]) else return 0 end
- 二、RedLock 算法
上面单机器部署的redis,不会存在锁争抢的问题,例如我们又多台master主机,2个不同的任务同时在不同的master上获取锁,就会存在一个锁被2个任务同时持有的问题,此时我们就需要一个策略来确保锁只被一个任务占有
redlock就是在获取锁时,同时请求多个master主机,如果主机总数为N,那么在n/2 + 1个redis增加锁成功时,即表示加锁成功,否则撤销刚才的加锁。
- 三、zk锁
zk锁的原理就是,创建一个znode节点,如果创建成功,即表示加锁成功,如果创建失败,即加锁失败。
如果别的节点来创建节点,发现该节点已经被创建,那么就监听这个节点,一单这个节点被释放,即所有监听到的任务都会争抢创建节点(当然也可以用队列实现排队,先到先得)
redis 分布式锁和 zk 分布式锁的对比
redis 分布式锁,其实需要自己不断去尝试获取锁,比较消耗性能。
zk 分布式锁,获取不到锁,注册个监听器即可,不需要不断主动尝试获取锁,性能开销较小。