首页
登录 | 注册

了解分布式锁

# 分布式锁

## 为什么需要分布式锁
<kbd>应用中需要避免多个线程在同一时间对同一个共享变量做修改
在单机部署的项目中,为了避免上述现象,需要对变量或代码块做同步
在分布式部署的项目中,为了避免上述现象,用同步是解决不了的(因为相同的项目部署在了多台服务器,同步只能解决单台服务器的问题),
所以就需要分布式锁,保证在分布式部署的应用集群中,同一个方法在同一时间只能被一台机器上的一个线程执行</kbd>


## 分布式锁有几种实现方式
<kbd>主流的实现方式有三种
1、利用数据库实现
2、利用缓存(redis)实现
3、利用zookeeper实现</kbd>

## 简述各种方式及优缺点
### 1、利用数据库实现
<kbd>优点:简单、易理解
缺点:高并发时,性能差,增加了数据库开销
</kbd>

方法一:

- 新建一张表,向该表中添加相同主键的一条记录, 哪个线程添加成功,即获得了分布式锁,
- 然后执行相关逻辑,逻辑执行完之后,删除数据库表中的该数据,删除即代表解锁


方法二、

- 使用for update,数据表会在查询的时候添加排它锁,
- 多个线程同时来执行时,只有一个会成功加锁,其余的线程都会阻塞,
- 加锁成功的线程即获得分布式锁的线程,该线程执行相关逻辑,
- 逻辑执行完之后,使用connection.commit解锁,此时阻塞的其他线程中会有一个加锁成功....


### 2、使用redis缓存实现
<kbd>优点:效率高
缺点:设置过期时间过长过短都不合适,需要根据实际情况权衡</kbd>

大概思路:
- 向redis中添加key,并设置过期时间
- 如果key已存在,则添加失败
- 如果key不存在,则添加成功
- 添加成功,即获得了分布式锁
- 获得锁的线程执行业务逻辑,执行完之后,删除redis中的key(即解锁)



### 3、通过zookeeper实现
<kbd>优点:有效的解决单点问题,不可重入问题,非阻塞问题以及锁无法释放的问题。实现起来较为简单
缺点:因为每次在创建锁和释放锁的过程中,都要动态创建、销毁临时节点来实现锁功能。
ZK中创建和删除节点只能通过Leader服务器来执行,然后将数据同步到所有的 Follower 机器上。
</kbd>
大概思路:

- 每一个锁都是zookeeper上的一个znode(普通节点)
- 当多个线程来获取锁时,都会在该znode上创建有序临时子节点,每个有序临时子节点都有自己的序号
- 只有序号最小的可以拥有锁,然后执行相关逻辑,执行完成之后删除子节点(即解锁),触发监听
- 序号如果不是最小的,则没有获得锁,设置监听事件,监听序号比本身小的前一个节点,
- 等待事件触发再次比较是否是最小的









相关文章

  • 关于分布式锁原理的一些学习与思考-redis分布式锁,zookeeper分布式锁
      首先分布式锁和我们平常讲到的锁原理基本一样,目的就是确保,在多个线程并发时,只有一个线程在同一刻操作这个业务或者说方法.变量. 在一个进程中,也就是一个jvm 或者说应用中,我们很容易去处理控制,在jdk java.util 并发包中已 ...
  • 已经更新100+篇~ 关注公众号,BAT大神带你飞~ 听说你还在写Java,看Spring,看Dubbo,今天SpringCloud, 明天Dubbo3.X新版本... 10个开发9个半在写Java后台?框架层出不穷,天天学新东西怕被甩淘汰 ...
  • 快三个月没写博客了,一直在忙着准备面试和去面试的路上,所以没时间写,也没什么想写的.现在告一段落,就总结一波! 面经 本人真的是双非一本.为什么加“真的”?因为有的人也写着"双非一本,进入阿里",但是某电子科技大学,比9 ...
  • .NET Core Dapper操作mysql数据库
    前言 现在ORM盛行,市面上已经出现了N款不同的ORM套餐了.今天,我们不谈EF,也不聊神马黑马,就说说 Dapper.如何在.NET Core中使用Dapper操作Mysql数据库呢,让我们跟随镜头(手动下翻)一看究竟. 配置篇 俗话说得 ...
  • 你所不知道的日志异步落库
    在互联网设计架构过程中,日志异步落库,俨然已经是高并发环节中不可缺少的一环.为什么说是高并发环节中不可缺少的呢? 原因在于,如果直接用mq进行日志落库的时候,低并发下,生产端生产数据,然后由消费端异步落库,是没有什么问题的,而且性能也都是异 ...
  • 高并发请求的缓存设计策略
    前几天,我司出了个篓子.当时正值某喜闻乐见的关键比赛结束,一堆人打开我司app准备看点东西,结果从来没有感受到过这么多关注量的该功能瞬间幸福到眩晕,触发了熔断,结果就是大量兴致冲冲打开app准备看该比赛结果的人被迫刷了十分钟三天前的野外跑酷 ...

2019 cecdns.com webmaster#cecdns.com
12 q. 0.081 s.
京ICP备10005923号