redis和zookeeper分布式锁的区别(优点、缺点)

一、为什么我们需要一把分布式锁?

  • 为了效率(efficiency),协调各个客户端避免做重复的工作。即使锁偶尔失效了,只是可能把某些操作多做一遍而已,不会产生其它的不良后果。比如重复发送了一封同样的 email(当然这取决于业务应用的容忍度)。
  • 为了正确性(correctness)。在任何情况下都不允许锁失效的情况发生,因为一旦发生,就可能意味着数据不一致(inconsistency),数据丢失,文件损坏,订单重复,超卖或者其它严重的问题。

二、分布式锁的三个属性

  • 互斥(Mutual Exclusion),这是锁最基本的功能,同一时刻只能有一个客户端持有锁;
  • 避免死锁(Dead lock free),如果某个客户端获得锁之后花了太长时间处理,或者客户端发生了故障,锁无法释放会导致整个处理流程无法进行下去,所以要避免死锁。最常见的是通过设置一个TTL(Time To Live,存活时间) 来避免死锁。
  • 容错(Fault tolerance),为避免单点故障,锁服务需要具有一定容错性。大体有两种容错方式,一种是锁服务本身是一个集群,能够自动故障切换(ZooKeeper、etcd);另一种是客户端向多个独立的锁服务发起请求,其中某个锁服务故障时仍然可以从其他锁服务读取到锁信息(Redlock),代价是一个客户端要获取多把锁,并且要求每台机器的时钟都是一样的,否则 TTL 会不一致,可能有的机器会提前释放锁,有的机器会太晚释放锁,导致出现问题。

核心:解决的是多线程或多进程情况下的数据一致性问题;分布式锁,解决的是分布式集群下的数据一致性问题。

三、JVM的锁无法解决分布式环境下数据一致性的问题

为了保证一个方法或属性在高并发情况下的同一时间只能被同一个线程执行,在传统单体应用单机部署的情况下,可以使用Java并发处理相关的API(如ReentrantLock或Synchronized)进行互斥控制。

在单机环境中,Java中提供了很多并发处理相关的API。但是,随着业务发展的需要,原单体单机部署的系统被演化成分布式集群系统后,由于分布式系统多线程、多进程并且分布在不同机器上,这将使原单机部署情况下的并发控制锁策略失效,单纯的Java API并不能提供分布式锁的能力。为了解决这个问题就需要一种跨JVM的互斥机制来控制共享资源的访问,这就是分布式锁要解决的问题!

举个例子:

机器A , 机器B是一个集群, A, B两台机器上的程序都是一样的, 具备高可用性能.

A, B机器都有一个定时任务, 每天晚上凌晨2点需要执行一个定时任务, 但是这个定时任务只能执行一遍, 否则的话就会报错, 那A,B两台机器在执行的时候, 就需要抢锁, 谁抢到锁, 谁执行, 谁抢不到, 就不用执行了!

四、Redis分布式锁和zookeeper分布式锁的区别

优点:
  1. ZooKeeper 分布式锁基于分布式一致性算法实现,能有效的解决分布式问题,不受时钟变迁影响,不可重入问题,使用起来也较为简单;
  2. 当锁持有方发生异常的时候,它和 ZooKeeper 之间的 session 无法维护。ZooKeeper 会在 Session 租约到期后,自动删除该 Client 持有的锁,以避免锁长时间无法释放而导致死锁。
缺点:

ZooKeeper 实现的分布式锁,性能并不太高。为啥呢?

因为每次在创建锁和释放锁的过程中,都要动态创建、销毁瞬时节点来实现锁功能。ZK 中创建和删除节点只能通过 Leader 服务器来执行,然后 Leader 服务器还需要将数据同步到所有的 Follower 机器上,这样频繁的网络通信,性能的短板是非常突出的。

总之,在高性能,高并发的场景下,不建议使用 ZooKeeper 的分布式锁。而由于 ZooKeeper 的高可用特性,所以在并发量不是太高的场景,推荐使用 ZooKeeper 的分布式锁。

小结一下,基于 ZooKeeper 的锁和基于 Redis 的锁相比在实现特性上有两个不同:

  • 在正常情况下,客户端可以持有锁任意长的时间,这可以确保它做完所有需要的资源访问操作之后再释放锁。这避免了基于 Redis 的锁对于有效时间(lock validity time)到底设置多长的两难问题。实际上,基于 ZooKeeper 的锁是依靠 Session(心跳)来维持锁的持有状态的,而 Redis 不支持 Sesion。
  • 基于 ZooKeeper 的锁支持在获取锁失败之后等待锁重新释放的事件。这让客户端对锁的使用更加灵活。

Redis分布式锁的难点:

对于有效时间的设置,可以通过RedLock 来动态增加锁的时间

Zookeeper:CP

Redis集群模式:AP

总结

  1. 基于ZooKeeper 的分布式锁,适用于高可靠(高可用)而并发量不是太大的场景;
  2. 基于Redis 的分布式锁,适用于并发量很大、性能要求很高的、而可靠性问题可以通过其他方案去弥补的场景。

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

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

相关文章

全自动封箱机技术革新:效率优化新篇章

在日新月异的物流行业中,全自动封箱机以其高效、精准的特性,成为了不可或缺的关键设备。然而,随着市场竞争的加剧和客户需求的不断升级,如何进一步优化全自动封箱机的效率,成为了行业内外关注的焦点。 一、全自动封箱机…

如何快速绘制logistic回归预测模型的ROC曲线?

详情请点击下方: 零代码课程来了,不需要R语言,快速构建预测模型 临床预测模型,也是临床统计分析的一个大类,除了前期构建模型,还要对模型的预测能力、区分度、校准度、临床获益等方面展开评价,确…

智慧车库管理系统

摘 要 随着城市化进程的不断加快,私家车数量的快速增长给城市交通带来了巨大的挑战,停车问题成为城市交通管理中的一大难题。车辆停车时,在停车场寻找停车位耗时过久,不仅仅浪费用户的时间,还可能引起交通拥堵。城市停…

Vite构建前端项目,在生产环境隐藏console和debugger

前言 本文主要探讨在前端项目构建过程中,在生产环境隐藏console和debugger,需要在vite配置文件修改的内容 debugger JavaScript的 debugger 语句会导致运行中的调试器(Chrome Dev Tools Debugger)将该语句视为自动配置的断点&a…

小程序中this(1)

}, onLoad: function() {}, }) 此时经过编译后模拟器的显示: 这里都容易理解,当点击了button按钮后,触发点击事件执行testfun函数,将test02设置为8,如图: 通过this.data.test028这种方式直接赋值可以吗&…

[深度学习] 门控循环单元GRU

门控循环单元(Gated Recurrent Unit, GRU)是一种用于处理序列数据的递归神经网络(Recurrent Neural Network, RNN)变体,它通过引入门控机制来解决传统RNN在处理长序列时的梯度消失问题。GRU与长短期记忆网络&#xff0…

【redis】redis概述

1、定义 Redis(Remote Dictionary Server),即远程字典服务,是一个开源的、内存中的数据结构存储系统。redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)…

基于springboot实现旅游网站系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现旅游网站系统演示 摘要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱,出错率…

想远程控制手机,用哪个软件好?

很多人都想知道安卓系统或iOS系统要如何实现手机远程控制手机、电脑远程控制手机,分别需要用到什么软件,这篇文章一次说清楚。 注意,安卓系统需要是7.0及以上版本,iOS系统需要是11及以上版本。具体使用步骤请点击关注,…

windows安装Nacos并使用

Nacos(前身为阿里巴巴的Nacos Config和Nacos Discovery)是一个开源的动态服务发现、配置和服务管理平台,由阿里巴巴开发并维护。它提供了一种简单且易于使用的方式来管理微服务架构中的服务注册、发现和配置管理。 主要功能包括:…

基于React18+Appwrite实现类似Instagram的社交APP

源码地址:https://github.com/sikichan/Ins-social-media-app 请给我一个Star ⭐️ 谢谢!

Java中ArrarList和LinkedList区别

在Java中,ArrayList和LinkedList是两种常用的List实现,它们都实现了List接口,但在底层数据结构和性能特性上有显著的差异。以下是它们的主要区别: 数据结构 ArrayList:基于动态数组实现。它的底层是一个可调整大小的…

使用v-viewer实现图片预览(vue2与vue3都支持)

官方文档 vue2: GitHub - mirari/v-viewer: Image viewer component for vue, supports rotation, scale, zoom and so on, based on viewer.js vue3: Vue3图片浏览组件v-viewer,支持旋转、缩放、翻转等操作 - Miraris Blog 安装 - vue2: npm instal…

PointCloudLib-八叉树模块-无组织点云数据的空间变化检测

八叉树是一种基于树的数据结构,用于组织稀疏的三维数据。在本教程中,我们将学习如何使用八叉树实现进行检测 多个无组织点云之间的空间变化,其大小、分辨率、密度和点顺序可能有所不同。通过递归比较 八叉树的树结构,由体素配置差异所表示的空间变化可以被识别出来。 此外,…

报道 | 2024年7月-2024年9月国际运筹优化会议汇总

封面图来源: https://www.pexels.com/zh-cn/photo/1181406/ 2024年7月-2024年9月召开会议汇总: 2024 INFORMS Advances in Decision Analysis Conference (ADA) Location: Finland Important Dates: Conference: July 10-12, 2024 Details:https://w…

【云原生】Kubernetes网络知识

Kubernetes网络管理 文章目录 Kubernetes网络管理一、案例概述二、案例前置知识点2.1、Kubernetes网络模型2.2、Docker网络基础2.3、Kubernetes网络通信2.3.1、Pod内容器与内容之间的通信2.3.2、Pod与Pod之间的通信 2.4、Flannel网络插件2.5、Calico网络插件2.5.1、Calico网络模…

【吊打面试官系列-Mysql面试题】说说对 SQL 语句优化有哪些方法?

大家好,我是锋哥。今天分享关于 【说说对 SQL 语句优化有哪些方法?】面试题,希望对大家有帮助; 说说对 SQL 语句优化有哪些方法? 1、Where 子句中:where 表之间的连接必须写在其他 Where 条件之前&#xff…

lru_cache vs cache

在Python中,lru_cache和cache都是functools模块提供的装饰器,用于缓存函数的结果,但它们的功能和使用场景略有不同。 functools.lru_cache lru_cache表示“最近最少使用”缓存。它是一个装饰器,用于缓存函数调用的结果。当缓存达…

智能工厂中滑环应用的集成式和分立式数据接口解决方案

第四次工业革命通过在生产过程中实现新场景来推动数字化制造向前发展。这些场景依赖于基本的设计原则,包括器件互联、信息透明、技术协助,以及分散决策。没有先进的无线通信技术,就无法在现代智能工厂中实现所有这些原则。它们支持在广泛的领…

Java露营基地预约小程序预约下单系统源码

轻松开启户外探险之旅 🌟 露营热潮来袭,你准备好了吗? 随着人们对户外生活的热爱日益增加,露营已成为许多人周末和假期的首选活动。但你是否曾因找不到合适的露营基地而烦恼?或是因为繁琐的预约流程而错失心仪的营地…