前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >分布式锁的实现方式

分布式锁的实现方式

作者头像
用户2141593
发布2018-05-18 09:45:22
9080
发布2018-05-18 09:45:22
举报
文章被收录于专栏:Java进阶

分布式锁跟 我们 平时用 的synchronized 锁 本质是都是锁。 不同的是:synchronized是 java提供的锁。 是java进程进行多线程控制时的锁。 用 分布式锁 的原因是,多个应用是不同的进程下运行的,显然用java 提供的 锁就不行了。

说说三种分布式锁的机制。 第一种,用数据库来做。

有一个 专门的 lock table。 字段有 id mothod_Name (做唯一约束)

画个图来表示:

数据库做锁
数据库做锁

比如三个应用进程 同时要操作 一个文件。

那么 只要设置三个进程插入的某个值 都相同,然后肯定只有一个应用进程能插入成功,成功就可以获取锁,然后去操作文件,失败的话可以重试。

释放锁的话,就将数据库的这条数据删除即可。

缺点,DB性能不好,还存在 删除数据失败的情况,如果删除数据失败,那么其他应用进程就无法获取到锁。

第二种:用zookeeper来实现

zookeeper的节点类型有四种,持久化节点,持久化有序节点,临时节点,临时有序节点。

我们可以将 订单 结算 用户三个 应用注册到 zookeeper 上当做临时节点, 然后zookeeper的临时节点又是有序的,

所以先注册的节点就能获取到锁。

画个图:

zookeeper实现分布式锁
zookeeper实现分布式锁

当锁用完了以后,zookeeper会将临时节点删除,然后节点2 节点3 就会按顺序获取到锁了

第三种使用 redis 来实现

redis 有一个 setnx命令。 setnx只会字key不存在的情况下 为key设置值 。

如果key 存在的话 setnx 返回的是 0 ;

如果key 不存在的话 setnx 返回的是 1 ;

三个应用进程谁先往 redis 里设置了值 谁就获取到了 锁。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年03月12日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档