其他分享
首页 > 其他分享> > 分布式锁实现

分布式锁实现

作者:互联网

分布式之分布式锁

1. 分布式锁

为了解决集群中多主机上不同线程之间的同步,需要在分布式系统中有类似于单主机下用于进程/线程同步的锁,也即分布式锁

1.1 基于MySQL

1.1.1 关键点

通过使用innodb提供的行锁来保证互斥性,来作为不同主机上线程的同步

1.1.2 可重入悲观锁实现

1)建表
create table if not exists lock_table(
    `id` int primary key ,
    `resource_name` varchar(10) ,
    `locker` varchar(20),
    `reentrant_cnt` int,
    `create_time` bigint(20),
    `update_time` bigint(20),
    unique key(resource_name))
    ENGINE=InnoDB DEFAULT CHARSET=utf8;

其中resource_name也即资源的名称,locker代表上锁者,reentrant_cnt代表重入次数

2)上锁

假设client_1对资源a上锁,流程如下

select * from lock_table where resource_name = 'a' for update;

这里先检查是否存在a记录,如果

3)解锁

假设client_1对资源a解锁,流程如下

select * from lock_table where resource_name = 'a' for update;

这里先检查是否存在a记录,这里查到是自己的记录,如果cnt的值

1.1.3 优劣

1.2 基于 zookeeper

1.2.1 关键点

使用zookeeper的watch机制来满足互斥性

1)watch机制定义

类比于观察者模式,支持如下监听事件

后面的方法均为操作,可以指定标志位代表是否开启监听,对应于命令为加入-w参数get -w /root/...

2)watch机制使用流程

1.2.2 可重入悲观锁实现

1)上锁

假设client_1想要对资源resource_1上锁,流程如下

当注册的监听事件触发时,就代表上锁成功

上过锁的示例图如下

/root  ----> /locks  ----> resource_1 ----> /ip1_port1_readlock_reentrantcnt_lockcnt-000000
	  |             |                |
	  |             |                 ----> /ip2_port2_writelock_reentrantcnt_lockcnt-000001
	   ----> ...     ----> resource_2
	  |
	  |
	 ...
2)解锁

只需要删除对应路径下的节点即可

1.1.3 优劣

1.3 基于Redis

1.3.1 关键点

通过利用redis的缓存特性,主要为存取快及支持过期机制,来实现分布式锁

1.3.2 悲观锁实现

1)上锁

假设client_1想要对资源a上锁,流程如下

2)解锁

1.3.3 改进

上面方案存在如下问题

因而提出下面改进

# 参考

再有人问你分布式锁,这篇文章扔给他 - 掘金 (juejin.cn)

ZooKeeper Watch 机制源码解析 - Spongecaptain 的个人技术博客

14.0 Zookeeper 分布式锁实现原理 | 菜鸟教程 (runoob.com)

分布式锁用Redis还是Zookeeper? - 知乎 (zhihu.com)

分布式锁的实现之 redis 篇 | 小米信息部技术团队 (xiaomi-info.github.io)

标签:cnt,resource,实现,lock,上锁,client,节点,分布式
来源: https://www.cnblogs.com/lins1/p/15239045.html