分布式锁的实现方式

分布式锁是指分布式环境下,系统部署在多个机器中,实现多进程分布式互斥的一种锁。实现分布式锁有三种主流方式,接下来一一盘点。

盘点之前要说说选择时的优缺点

数据库实现的锁表完全不推荐。
Redis分布式锁性能优于ZooKeeper,因为不需要反复创建节点。
实现的简单程度和可靠性ZooKeeper更好,因为其封装好的框架几乎能应对所有的分布式锁问题。

基于数据库实现的——锁表

实际上就是开一个表。当我们要锁住某个资源时,就在该表中增加一条记录,想要释放锁的时候就删除这条记录。但数据库表要磁盘io,所以效率很低。并且一旦这个数据库寄了,那系统崩了。数据库锁没有失效时间,未获得锁的进程只能一直等待已获得锁的进程主动释放锁。倘若已获得共享资源访问权限的进程突然挂掉、或者解锁操作失败,使得锁记录一直存在数据库中,无法被删除,而其他进程也无法获得锁,从而产生死锁现象。

基于缓存实现的——缓存锁

就是说把数据存放在计算机内存中,不需要写入磁盘,减少了IO读写,实现时候是维护一个队列来维持进程访问共享资源的顺序的。
Redis的setnx和delete方法就支持这一方式。

也存在缺陷,因为进程没法主动释放锁,假设ABC三个进程来,A完事了到B,B进程对应的服务器坏了,那C就得等B超时自动释放才能访问共享资源。通过超时时间来控制锁的失效时间,并不是十分靠谱,因为一个进程执行时间可能比较长,或受系统进程做内存回收等影响,导致时间超时,从而不正确地释放了锁。

ZooKeeper

ZooKeeper基于树形数据存储结构实现分布式锁,ZooKeeper的树形数据存储结构主要由4种节点构成:

  • 持久节点(PERSISTENT)。这是默认的节点类型,一直存在于ZooKeeper中。
  • 持久顺序节点(PERSISTENT_SEQUENTIAL)。在创建节点时,ZooKeeper根据节点创建的时间顺序对节点进行编号命名。
  • 临时节点(EPHEMERAL)。当客户端与Zookeeper连接时临时创建的节点。与持久节点不同,当客户端与ZooKeeper断开连接后,该进程创建的临时节点就会被删除。
  • 临时顺序节点(EPHEMERAL_SEQUENTIAL)。就是按时间顺序编号的临时节点。

ZooKeeper是根据临时顺序节点来实现的分布式锁。以电商售卖吹风机的场景为例。假设用户A、B、C同时在11月11日的零点整提交了购买吹风机的请求,ZooKeeper会为每个进程分配一个临时顺序节点。每个节点都有一个监听器监听当前自己是不是序号最小的**(理论上要监听共享资源上的所有节点,实际上只要监听自己上一个节点的状态就行)**,是就去访问共享资源,不是就判断:

  • 假设一个进程要读,前面有写的话,就得等待;假设前面没有写的,就可以并发读。
  • 假设一个进程要写,前面有进程在就得等待。
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/345441.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

01、领域驱动设计:微服务设计为什么要选择DDD总结

目录 1、前言 2、软件架构模式的演进 3、微服务设计和拆分的困境 4、为什么 DDD适合微服务 5、DDD与微服务的关系 6、总结 1、前言 我们知道,微服务设计过程中往往会面临边界如何划定的问题,不同的人会根据自己对微服务的理 解而拆分出不同的微服…

通过 GScan 工具自动排查后门

一、简介 GScan 是一款为安全应急响应提供便利的工具,自动化监测系统中常见位置。 工具运行环境:CentOS (6、7) python (2.x、3.x) 工具检查项目: 1、主机信息获取 2、系统初始化 alias 检查 3、文件类安全扫描 3.1、系统重要文件完整行…

JS进阶-深入对象(二)

拓展:深入对象主要介绍的是Js的构造函数,实例成员,静态成员,其中构造函数和Java种的构造函数用法相似,思想是一样的,但静态成员和实例成员和java种的有比较大的差别,需要认真理解 • 创建对象三…

Switch用法以及新特性-最全总结版

本篇文章参考了大佬文章,感谢大佬无私分享: http://t.csdnimg.cn/MjZnX http://t.csdnimg.cn/QFg0x 目录 一、Switch用法:JDK7及以前 1.1、举例一: 1.2、举例二: 二、Switch穿透: 2.1、举例&#xf…

三极管的奥秘:如何用小电流控制大电流

双极性晶体管(英语:bipolar transistor),全称双极性结型晶体管(bipolar junction transistor, BJT),俗称三极管,是一种具有三个引脚的电子元器件。 本文是讲述的是三极管的基础知识…

基于openssl v3搭建ssl安全加固的c++ tcpserver

1 概述 tcp server和tcp client同时使用openssl库,可对通信双方流通的字节序列进行加解密,保障通信的安全。本文以c编写的tcp server和tcp client为例子,openssl的版本为v3。 2 安装openssl v3 2.1 安装 perl-IPC-Cmd openssl项目中的co…

企业内部知识库搭建教程,赶紧收藏起来

在企业运营中,内部知识库搭建是一项重要的挑战,并需要合理的规划与管理。尤其对于中大型企业,内部知识库能够提高工作效率,减轻员工工作压力与突发事件的处理的困扰。下面给大家提供一份完整的内部知识库搭建教程,快看…

UE4运用C++和框架开发坦克大战教程笔记(十五)(第46~48集)

UE4运用C和框架开发坦克大战教程笔记(十五)(第46~48集) 46. 批量加载 UClass 功能测试批量加载多个同类 UClass 资源 47. 创建单个资源对象测试加载并创建单个 UClass 资源对象 48. 创建同类资源对象 46. 批量加载 UClass 功能 逻…

Leetcode1143. 最长公共子序列

解题思路 求两个数组或者字符串的最长公共子序列问题,肯定是要用动态规划的。下面的题解并不难,你肯定能看懂。 首先,区分两个概念:子序列可以是不连续的;子数组(子字符串)需要是连续的&#xf…

rabbitmq基础-java-3、Fanout交换机

1、简介 Fanout,英文翻译是扇出。 2、 特点 1) 可以有多个队列 2) 每个队列都要绑定到Exchange(交换机) 3) 生产者发送的消息,只能发送到交换机 4) 交换机把消息发送给绑定过的…

3d模型怎么分辨材质?--模大狮模型网

在3D模型中,通常可以通过以下几种方式来分辨材质: 视觉检查:在3D渲染视图或预览窗口中,您可以直接观察模型的外观来区分不同的材质。不同的材质可能具有不同的颜色、纹理、反射率等特征,因此通过直观的视觉检查&#x…

网络通信课程总结(小飞有点东西)

27集 局域网通信:用MAC地址 跨局域网通信:用IP地址(MAC地址的作用只是让我们找到网关) 又因为arp技术,可以通过MAC地址找到IP地址,所以我们可以通过IP地址定位到全世界任意一台计算机。 28集 在数据链路…

C语言每日一题(47)两数相加II

力扣 445 两数相加II 题目描述 给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。 你可以假设除了数字 0 之外,这两个数字都不会以零开头。 示例1: 输入&#xff…

了解WPF控件:RadioButton和RepeatButton常用属性与用法(九)

掌握WPF控件:熟练常用属性(九) RadioButton 一种允许用户在一组选项中单选一个的控件。通常用于提供一组互斥的选项供用户选择。 常用属性描述Content用于设置 RadioButton 显示的文本内容。GroupName用于将多个 RadioButton 控件组合到一…

船的最小载重量-算法

说明:题解完全是从leetCode上拉下来的,在这里只是作为一个备份,怕之后找不着了。同时也分享给大家,这个题目用了一个我之前从未遇到的思路。 原题:船的最小载重量-leetCode1101 题目(看懂题目了吗&#xff…

python批量处理修改pdf内容

将PDF转换为Word: 使用pdf2docx库中的Converter类来进行PDF转换。convert_pdf_to_docx函数接受PDF文件路径和输出的Word文档路径作为参数。通过调用Converter对象的convert方法将PDF转换为Docx格式。最后调用close方法关闭Converter对象并保存转换后的文档。 将Word…

QT下载、安装详细教程[Qt5.15及Qt6在线安装,附带下载链接]

QT5.15及QT6的下载和安装 1.下载1.1官网下载1.2国内镜像网站下载 2.安装3.软件启动及测试程序运行3.1Qt Creator(Community) 1.下载 QT自Qt5.15版本后不在支持离线安装包下载(非商业版本,开源),故Qt5.15及Qt6需要使用在线安装程序…

Zephyr 源码调试

背景 调试环境对于学习源码非常重要,但嵌入式系统的调试环境搭建稍微有点复杂,需要的条件略多。本文章介绍如何在 Zephyr 提供的 qemu 上调试 Zephyr 源码,为后续分析 Zephyr OS 相关原理做铺垫。 环境 我的开发环境为 wsl ubuntu&#xf…

使用 LlamaIndex 部署本地 Mistral-7b 大模型实现 RAG

原理 LlamaIndex的文档链接:Using LLMs - LlamaIndex 🦙 0.9.33 LlamaIndex 的一般使用模式如下: 加载文档(手动或通过数据加载器)将文档解析为节点构建索引(来自节点或文档)(可选,高级&…

Java内存模型

主内存与工作内存 Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。此处的变量包括实例变量、静态字段和构成数组对象的元素,但不包括局部变量与方法参数,因为局部变…
最新文章