首页 > 中间件 > 分布式锁

分布式锁

作者: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 分布式锁,获取不到锁,注册个监听器即可,不需要不断主动尝试获取锁,性能开销较小。

您必须 [ 登录 ] 才能发表留言!