第二章架构设计之技术实践篇(中)

2022-01-06  本文已影响0人  农民工进城

本章要点

1. 分布式锁特点

分布式特点:

2.分布式锁实现

2.1 Redis 分布式锁
2.1.1 加锁:
SET key value [EX seconds] [PX milliseconds] [NX|XX]
2.1.2 解锁:(判断value是否相等,相等才能删除)
if redis.call('get',KEYS[1]) == ARGV[1] then 
   return redis.call('del',KEYS[1])  //先比较一下值,相等才删除。防止其他线程把锁给解了
else
   return 0 
end

redis分布式锁存在的问题:

redisson主要解决的就是redis这两个问题。

2.2 基于Mysql 分布式锁
2.2.1 基于表记录
CREATE TABLE `database_lock` (
    `id` BIGINT NOT NULL AUTO_INCREMENT OMMENT '主键id',
    `resource` varchar(32) NOT NULL COMMENT '锁定的资源',
    `description` varchar(1024) NOT NULL DEFAULT "" COMMENT '描述',
    PRIMARY KEY (`id`),
    UNIQUE KEY `uiq_idx_resource` (`resource`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='数据库分布式锁表';

获取锁

INSERT INTO database_lock(resource, description) VALUES ('mylock', 'lock');

释放锁

DELETE FROM database_lock WHERE resource='mylock';
2.2.2 乐观锁(版本号或时间戳)
CREATE TABLE `optimistic_lock` (
    `id` BIGINT NOT NULL AUTO_INCREMENT,
    `resource` int NOT NULL COMMENT '锁定的资源',
    `version` int NOT NULL COMMENT '版本信息',
    `created_at` datetime COMMENT '创建时间',
    `updated_at` datetime COMMENT '更新时间',
    `deleted_at` datetime COMMENT '删除时间', 
    PRIMARY KEY (`id`),
    UNIQUE KEY `uiq_idx_resource` (`resource`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='数据库分布式锁表';

2.2.3悲观锁
2.3 基于ZK分布式锁

ZK有四种节点类型:持久节点、持久节点顺序节点、临时节点和临时顺序节点;ZK分布式锁主要是用临时顺序节点。

curator是Netflix公司开源的一个ZooKeeper客户端封装。curator 对于锁这块做了一些封装,curator 提供了InterProcessMutex 这样一个 api

Curator的几种锁方案:

InterProcessMutex通过在zookeeper的某路径节点下创建临时序列节点来实现分布式锁,即每个线程(跨进程的线程)获取同一把锁前,都需要在同样的路径下创建一个节点,节点名字由uuid + 递增序列组成。而通过对比自身的序列数是否在所有子节点的第一位,来判断是否成功获取到了锁。当获取锁失败时,它会添加watcher来监听前一个节点的变动情况,然后进行等待状态。直到watcher的事件生效将自己唤醒,或者超时时间异常返回

2.4 基于 etcd分布式锁

etcd分布式锁实现的基础机制:

总结对比:

image.png
上一篇 下一篇

猜你喜欢

热点阅读