Zookeeper与Redis 对比

1. 为什么使用分布式锁?

        使用分布式锁的目的,是为了保证同一时间只有一个 JVM 进程可以对共享资源进行操作。

根据锁的用途可以细分为以下两类:

        1、 允许多个客户端操作共享资源,我们称为共享锁

               这种锁的一般是对共享资源具有幂等性操作的场景,主要是为了避免重复操作共享                 资源频繁加锁带来的性能开销。

        2、 只允许一个客户端操作共享资源,我们成为排他锁

               这种锁一般是用在对共享资源操作具有非幂等性操作的场景,也就是需要保证在同                 一时刻只有一个进程或者线程能够访问这个共享资源。


2. 目前实现分布式锁最常用的中间件是 Redis和Zookeeper      

a、第一种,Redis 可以通过两种方式来实现 

                i. 利用 Redis 提供的`SET key value NX PX milliseconds `指令,这个指令是设                           置一个 key-value,如果 key 已经存在,则返回 0,否则返回 1, 我们基于这个                     返回值来判断锁的占用情况从而实现分布式锁。

                ii. 基于 Redission 客户端来实现分布式锁,Redisson 提供了分布式锁的封装方                          法,我们只需要调用 api 中的`lock()`和`unlock()`方法。它帮我们封装锁实现                      的细节和复杂度

                                1. redisson 所有指令都通过 lua 脚本执行并支持 lua 脚本原子性执行

                                2. redisson 中有一个 watchdog 的概念,翻译过来就是看门狗,它会在                                      你获取锁之后,每隔 10 秒帮你把 key 的超时时间设为 30s,就算一                                        直持有锁也不会出现 key 过期了。

                                    “看门狗”的逻辑保证了没有死锁发生。

b. 第二种,基于 ZK 实现分布式锁的落地方案

        Zookeeper 实现分布式锁的方法比较多,我们可以使用有序节点来实现。

                 i. 每个线程或进程在 Zookeeper 上的`/lock`目录下创建一个临时有序的节点表示                        去抢占锁,所有创建的节点会按照先后顺序生成一个带有序编号的 节点。

                 ii. 线程创建节点后,获取/lock 节点下的所有子节点,判断当前线程创建的节点是                       否是所有的节点的序号最小的。

                 iii. 如果当前线程创建的节点是所有节点序号最小的节点,则认为获取锁成功。

                 iv. 如果当前线程创建的节点不是所有节点序号最小的节点,则对节点序号的前一                       个节点添加一个事件监听,当前一个被监听的节点释放锁之后,触发回调通                            知,从而再次去尝试抢占锁。


3. 两种方案都有各自的优缺点

对于 redis 的分布式锁而言,它有以下缺点:

1、它获取锁的方式简单粗暴,如果获取不到锁,会不断尝试获取锁,比较消耗性能

2、Redis 是 AP 模型,在集群模式中由于数据的一致性会导致锁出现问题,即便使用                  Redlock 算法来实现,在某些复杂场景下,也无法保证其实现 100%的可靠性。 不过在          实际开发中使用 Redis 实现分布式锁还是比较常见,而且大部分场情况下不会遇 到”极端        复杂的场景“,更重要的是 Redis 性能很高,在高并发场景中比较合适。

补充:

        明显AP结构选择了高可用和分区容错性,此时,那个失去联系的节点依然可以向系统提供服务,不过它的数据就不能保证是同步的了(失去了C属性)。Eureka就是一个AP架构的例子,当Eureka客户端心跳消失的时候,那Eureka服务端就会启动自我保护机制,不会剔除该EurekaClient客户端的服务,依然可以提供需求;

对于 zk 分布式锁而言

1、zookeeper 天生设计定位就是分布式协调,强一致性。锁的模型健壮、简单易用、 适合          做分布式锁。

2、 如果获取不到锁,只需要添加一个监听器就可以了,不用一直轮询,性能消耗较小。 如       果要在两者之间做选择,就个人而言的话,比较推崇 ZK 实现的锁,因为对于分布 式             锁言,它应该符合 CP 模型,但是 Redis 是 AP 模型,所以在这个点上,Zookeeper 会更       加合适。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

24数据结构-图的基本概念与存储结构

目录 第六章 图6.1 图的基本概念知识回顾 6.2 图的储存结构(邻接矩阵法)1. 数组表示法(1) 有向图,无向图的邻接矩阵 2. 定义邻接矩阵的结构3. 定义图的结构4. 构造图G5. 特点 第六章 图 6.1 图的基本概念 图是一种非线性结构 图的特点&am…

手把手教你快速实现内网穿透

快速内网穿透教程 文章目录 快速内网穿透教程前言*cpolar内网穿透使用教程*1. 安装cpolar内网穿透工具1.1 Windows系统1.2 Linux系统1.2.1 安装1.2.2 向系统添加服务1.2.3 启动服务1.2.4 查看服务状态 2. 创建隧道映射内网端口3. 获取公网地址 前言 要想实现在公网访问到本地的…

海康威视iVMS综合安防系统任意文件上传(0Day)

漏洞描述 攻击者通过请求/svm/api/external/report接口任意上传文件,导致获取服务器webshell权限,同时可远程进行恶意代码执行。 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安全、荣誉和…

如何正确的向chatgpt提问?

有没有发现,在使用ChatGPT的时候,他回答的一些问题并不是我们想要的甚至有的时候出现牛头不对马嘴的情况。 这时候就会感慨一句,人工智能也不怎么样嘛! 但是,有没有想过,是自己问的问题太宽泛,没有问到点上…

Oracle数据库审计

1.什么是审计 审计是用来监控和记录用户的数据库操作的 2.审计级别 语句审计权限审计对象审计 3.查看审计功能是否开启: show parameter audit;相关参数: audit_file_destOS中审计信息存放位置audit_sys_operations默认值为FALSE,即不审…

为什么商业基础软件需要开源

Bytebase 本身是一家商业软件公司,而作为最核心资产的代码从 Day 0 却是开源的。同时我们还是 star-history.com 的运营者,大家在各种开源渠道会看到它生成的图: 一直以来,常会被别人问起的一个问题,就是为什么 Byteba…

【学习日记】【FreeRTOS】任务句柄、任务控制块TCB、任务栈、任务、就绪表详解

写在前面 本文是对FreeRTOS中任务句柄、任务控制块TCB、任务栈、任务、就绪表详解。 一、裸机和RTOS中函数存储位置详解 左图为裸机开发时 RAM 的使用情况,右图是使用了 FreeRTOS 后 RAM 的使用情况(图片来自野火)。 无论是裸机开发还是Fr…

【docker】设置 docker 国内镜像报错,解决方案

一、报错: [rootlocalhost ~]# systemctl restart docker Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.二、原因&#xf…

实现分布式事务:Java与MySQL的XA事务协调

目录 一、什么是XA事务 二、Java中的XA事务支持 三、MySQL的XA事务协调 四、注意事项和最佳实践 五、基于 java 语言的开发工具 六、小结 分布式事务是在跨多个数据库或服务之间保持一致性的重要机制。Java与MySQL的XA(eXtended Architecture)事务…

NPM包的安装、更新、卸载

目录 1、下载安装全局包 2、解决全局安装包时的EACCES权限错误 2.1 重新安装NPM 2.2 手动更改npm的默认目录 3、更新从注册表下载的包 3.1 更新本地包 3.2 更新全局安装的软件包 3.3 确定哪些全局包需要更新 3.4 更新单个全局包 3.5 更新所有全局安装的软件包 4、在项…

【ASP.NET MVC】使用动软(五)(13)

一、问题 前文完成的用户登录后的首页如下: 后续账单管理、人员管理等功能页面都有相同的头部,左边和下边,唯一不同的右边内容部分,所以要解决重复设计的问题。 二、解决方法——使用布局页 在Views上右键添加新建项&#xff…

【结构型设计模式】C#设计模式之享元模式

享元模式(Flyweight Pattern)是一种结构型设计模式,旨在通过尽可能共享对象来减少内存使用和提高性能。它将对象分为两种类型:内部状态(Intrinsic State)和外部状态(Extrinsic State&#xff09…

CRUD操作-select

CRUD操作-select 基本查询(一) -- CRUD操作 -- insert into -- insert -- replace intouse dbok; show tables; drop table if exists t5,t6,t_stu,t_student,t_teacher;-- 建立学生表 create table t_student(sid int unsigned auto_increment,sname v…

AWS认证SAA-C03每日一题

本题库由云计算狂魔微信公众号分享。 【SAA-C03助理级解决方案架构师认证】A company has a multi-tier application that runs six front-end web servers in an Amazon EC2 Auto Scaling group in a single Availability Zone behind an Application Load Balancer(ALB).A …

python 转换带时区的时间字符串为统一时区的时间

python 转换带时区的时间字符串为统一时区的时间 比如我们将gitlab上面commit的提交时间统一转换成北京时间 及0800 东八区时间 gitlab接口获取的commit信息中: “committed_date”: “2023-07-27T19:32:41.000-07:00” 美国时间 “committed_date”: “2023-07-2…

多维时序 | MATLAB实现ZOA-CNN-BiGRU-Attention多变量时间序列预测

多维时序 | MATLAB实现ZOA-CNN-BiGRU-Attention多变量时间序列预测 目录 多维时序 | MATLAB实现ZOA-CNN-BiGRU-Attention多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.Matlab基于ZOA-CNN-BiGRU-Attention斑马优化卷积双向门控循环单元网络…

【云原生】Kubernetes控制器中DaemonSet与Job的使用

目录 DaemonSet 1 什么是 DaemonSet 2 使用 DaemonSet Job 1 什么是 Job 2 使用 Job 3 自动清理完成的 Job 控制器无法解决问题 DaemonSet 1 什么是 DaemonSet DaemonSet | Kubernetes DaemonSet 确保全部(或者某些)节点上运行一个 Pod 的副本…

eeglab(自用)

目录 1.加载、显示数据 2.绘制脑电头皮图 3.绘制通道光谱图 4.预处理工具 5.ICA去除伪迹 5. 提取数据epoch 1.加载、显示数据 观察事件值(Event values):该数据集中包含2400个事件,每个事件指定了EEG.event结构的字段Type(类型)、position(位置)和…

检测新突破 | AlignDet:支持各类检测器自监督新框架(ICCV2023)

引言 论文链接:https://arxiv.org/abs/2307.11077 项目地址:https://github.com/liming-ai/AlignDet 这篇论文主要研究目标检测领域的自监督预训练方法。作者首先指出,当前主流的预训练-微调框架在预训练和微调阶段存在数据、模型和任务上的…

【技巧】如何设置Word文档部分内容“限制编辑”?

我们知道,Word文档可以设置“限制编辑”,也就是保护文档不被随意更改。 那如果只想保护文档中的部分内容,其他内容还是随意编辑更改,是否可以设置部分内容“限制编辑”?答案是可以的,下面小编来举例说明一…