分布式锁实现的几种方式

基于数据库实现分布式锁(表、数据库排他锁)

基于缓存(redis,memcached,tair)

基于Zookeeper实现分布式锁

关注点:

单点问题?(集群)

失效时间?(锁的释放 VS 失效)

非阻塞?(while自旋 || wacther通知)

非可重入?(记录当前获得锁的机器的主机信息和线程信息;三种方式都是)

根据不同的应用场景正确选择:

————————————————————

从理解的难易程度角度(从低到高)

数据库 > 缓存 > Zookeeper

————————————————————

从实现的复杂性角度(从低到高)

Zookeeper >= 缓存 > 数据库

————————————————————

从性能角度(从高到低)

缓存 > Zookeeper >= 数据库

————————————————————

从可靠性角度(从高到低)

Zookeeper > 缓存 > 数据库

————————————————————

ZK分布式锁的实现

ZK分布式锁之前有提过,有简单互斥锁、互斥锁、读写锁;互斥锁是在简单互斥锁的基础上进行了优化,防止羊群效应问题,直接根据事件通知下一子节点来获得锁;

调整后的分布式锁算法流程如下:(优化为“等待前一个子节点删除通知”)

1.客户端连接zookeeper,并在/lock下创建临时的且有序的子节点,第一个客户端对应的子节点为/lock/lock-0000000000,第二个为/lock/lock-0000000001,以此类推。

2.客户端获取/lock下的子节点列表,判断自己创建的子节点是否为当前子节点列表中序号最小的子节点,如果是则认为获得锁,否则监听刚好在自己之前一位的子节点删除消息,获得子节点变更通知后重复此步骤直至获得锁;

3.执行业务代码;

4.完成业务流程后,删除对应的子节点释放锁。

分布式锁的几种实现方式:http://www.hollischuang.com/archives/1716

基于Zookeeper的分布式锁(源码分析):

http://www.dengshenyu.com/java/%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F/2017/10/23/zookeeper-distributed-lock.html

 

分布式锁实现方式介绍和Zookeeper实现原理的更多相关文章

  1. 分布式锁实践(二)-ZooKeeper实现总结

    写在最前面 前几周写了篇 利用Redis实现分布式锁 ,今天简单总结下ZooKeeper实现分布式锁的过程.其实生产上我只用过Redis或者数据库的方式,之前还真没了解过ZooKeeper怎么实现分布 ...

  2. 【分布式锁】07-Zookeeper实现分布式锁:Semaphore、读写锁实现原理

    前言 前面已经讲解了Zookeeper可重入锁的实现原理,自己对分布式锁也有了更深的认知. 我在公众号中发了一个疑问,相比于Redis来说,Zookeeper的实现方式要更好一些,即便Redis作者实 ...

  3. Redis分布式锁实现方式(附有正解及错误示例)

    一.前言 本文内容主要来自博客:https://wudashan.com/2017/10/23/Redis-Distributed-Lock-Implement/,本文用于归纳总结及笔记用途,如有需要 ...

  4. 面试必问:分布式锁实现之zk(Zookeeper)

    点赞再看,养成习惯,微信搜索[三太子敖丙]关注这个互联网苟且偷生的工具人. 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点.资料以及我的 ...

  5. .net Redis分布式锁,Dictionary,ConcurrentDictionary 介绍

    1.背景 在计算机世界里,对于锁大家并不陌生,在现代所有的语言中几乎都提供了语言级别锁的实现,为什么我们的程序有时候会这么依赖锁呢?这个问题还是要从计算机的发展说起,随着计算机硬件的不断升级,多核cp ...

  6. 分布式锁的实现【基于ZooKeeper】

    引言 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提 ...

  7. 【分布式锁】03-使用Redisson实现RedLock原理

    前言 前面已经学习了Redission可重入锁以及公平锁的原理,接着看看Redission是如何来实现RedLock的. RedLock原理 RedLock是基于redis实现的分布式锁,它能够保证以 ...

  8. 【分布式锁】04-使用Redisson实现ReadWriteLock原理

    前言 关于读写锁,大家应该都了解JDK中的ReadWriteLock, 当然Redisson也有读写锁的实现. 所谓读写锁,就是多个客户端同时加读锁,是不会互斥的,多个客户端可以同时加这个读锁,读锁和 ...

  9. 分布式锁的几种使用方式(redis、zookeeper、数据库)

    Q:一个业务服务器,一个数据库,操作:查询用户当前余额,扣除当前余额的3%作为手续费 synchronized lock db lock Q:两个业务服务器,一个数据库,操作:查询用户当前余额,扣除当 ...

随机推荐

  1. Django 的 CBV&FBV

    Django FBV, function base view  视图里使用函数处理请求 url 1 url(r‘^users/‘, views.users), views 1 2 3 4 5 from ...

  2. 字符串:StringBuilder()

    String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全) [1]String和StringBuffer      String ...

  3. quartz的配置文件说明

    # Default Properties file for use by StdSchedulerFactory # to create a Quartz Scheduler Instance, if ...

  4. 【CodeChef】LECOINS(同余最短路,背包DP)

    题意:给定n个物品,每个物品可以取无限次,每个物品有两种属性:价值v和颜色c 现在有q个询问,每次询问是否能取出价值和为S的方案,如有多解输出不同颜色种数的最大值 题意:看到BZOJ评论区有好心人说C ...

  5. pyCharm报错"your evaluation license has expired, pycharm will now exit"解决方法(实测)

    一.修改C:\Windows\System32\drivers\etc 目录下的hosts文件 1.打开hosts文件,路径是 c:\windows\system32\drivers\etc\host ...

  6. CVE-2019-0708

    本机IP 192.168.1.100 靶机IP 1:windows2003sever  :192.168.1.101 确认3389端口开启 0x01测试windowsxp 切到目录 目标机器确实存在 ...

  7. 简单地使用webpack进行打包

    之前写的有些零散,现在一步步再重新写.记住: 如果你步骤对,但是始终没成功, 那么请不要烦心, 因为webpack版本4以上, 语义更加严格,命令有一些已经发生改变了,所以并不是你的问题! 一.确保已 ...

  8. socket的补充

  9. 第四周总结 & 实验报告(二)

    第四周课程总结 一.String类 1.实例化 (1)直接赋值 public class Xxxx{ public static void main(String args[]){ String a ...

  10. SpringMvc中ModelAndView模型的应用

    /** * 目标方法的返回值可以是 ModelAndView 类型. * 其中可以包含视图和模型信息 * SpringMVC 会把 ModelAndView 的 model 中数据放入到 reques ...