1.1.1. 17.再谈分布式锁

单点 Redis 锁

复习一下,单点 Redis 锁。

加锁

set [key] [value] [EX second|PX millisecond] [NX|XX]

EX|PX:过期时间 NX:若 key 不存在,则设置。 XX:若 key 存在,则设置。

删除锁

if redis.call("get",KEYS[1]) == ARGV[1] then
    return redis.call("del",KEYS[1])
else
    return 0
end

缺陷:如果实例挂了,依赖它的服务将都挂掉。

主从架构

如果把单点 Redis 锁变成主从模式。那么可能会存在这样的情况。

  1. 客户端 A 申请在 master 上获取锁。
  2. master 同步数据给 slave 时挂掉了。没有同步成功
  3. slave 取代 master。
  4. 客户端 B 申请获取锁,获取成功。分布式锁失效。

redlock

  1. 使用 redlock 需要多个实例,这些实例间没有主从关系。
  2. 加锁时,会向过半节点发送 set(key, value, nx=True, ex=xxx) 指令,只要过半节点 set 成功,那就加锁成功。不过中间还考虑了出错重试和时间漂移的问题。
  3. 删除时,直接像所有节点发送 del 指令。

redlock 需要引入额外的库,并且性能下降(毕竟操作多个节点)。

Copyright © Kagami丶 2019 all right reserved,powered by Gitbook该文件修订时间: 2019-10-17 19:28:44

results matching ""

    No results matching ""