SpringCloud(27. Redis 和 ZK 分布式锁)

news2024/11/24 3:56:35

上一篇 :26.分布式服务框架Dubbo面试题简析

1. redis 分布式锁

  • 官方叫做 RedLock 算法,是 redis 官方支持的分布式锁算法。
  • 这个分布式锁有 3 个重要的考量点:
    • 互斥(只能有一个客户端获取锁)
    • 不能死锁
    • 容错(只要大部分 redis 节点创建了这把锁就可以)

RedLock 获取锁基本思想

  • 这个场景是假设有一个 redis cluster,有 5 个 redis master 实例。然后执行如下步骤获取一把锁:
    • 获取当前时间戳,单位是毫秒;
    • 跟上面类似,轮流尝试在每个 master 节点上创建锁,过期时间较短,一般就几十毫秒;
    • 尝试在大多数节点上建立一个锁,比如 5 个节点就要求是 3 个节点 (n / 2 + 1);
    • 客户端计算建立好锁的时间,如果建立锁的时间小于超时时间,就算建立成功了;
    • 要是锁建立失败了,那么就依次将之前建立过的锁删除;
    • 只要别人建立了一把分布式锁,你就得不断轮询去尝试获取锁。
      在这里插入图片描述
  • Redis 官方给出了以上两种基于 Redis 实现分布式锁的方法,详细说明可以查看:https://redis.io/topics/distlock 。

2. ZK 分布式锁

  • zk 分布式锁,其实可以做的比较简单
    • 就是某个节点尝试创建临时 znode,此时创建成功了就获取了这个锁;
    • 这个时候别的客户端来创建锁会失败,只能注册个监听器监听这个锁。
    • 释放锁就是删除这个 znode,一旦释放掉就会通知客户端,
    • 然后有一个等待着的客户端就可以再次重新加锁。
  • 这种情况下没有获取锁的客户端是无序的,当锁被释放,所有等待中的客户端都会尝试抢占锁
  • 这就类似 ReentrantLock 中的公平、非公平锁
  • 如果想要等待的客户端是有序的,可以创建临时顺序节点:
    • 创建临时顺序节点后,若有多个客户端同时尝试创建临时节点时,都会创建成功,但是在创建的节点名称后自动加上一个序号
    • 第一个拿到锁的客户端会执行;
    • 后面的每个客户端都会去监听排在自己前面的那个人创建的 node 上,也即序号值-1的节点,
    • 一旦客户端释放了锁,zookeeper 就会通知排在后面的客户端,
    • 一旦被通知了之后,就去获取到锁,就可以执行代码了。

3. redis 分布式锁和 zk 分布式锁的对比

  • Redlock 在实践中存在一些问题,主要包括以下几点:

    1. 误判问题:Redlock 算法中需要获取多个 Redis 节点的锁,如果其中一个节点出现了故障或网络延迟,可能会导致其他节点误判为锁已经被获取。这种情况下可能会导致多个客户端同时获取到锁,从而导致竞态条件的发生。
    2. 时间漂移问题:由于系统中不同节点之间时钟的不同步,可能会导致一个节点的时钟比其他节点快或慢。如果某个节点的时钟比其他节点快,那么它会提前释放锁,从而导致其他节点误认为锁已经被释放。如果某个节点的时钟比其他节点慢,那么它可能会错误地认为锁还未被释放。
    3. 数据分片问题:Redlock 算法要求锁的数据在所有节点上都存在,但是在数据被分片存储的情况下,锁的数据可能只存在于部分节点上,这会导致锁无法正常被获取。
    4. 单点故障问题:Redlock 算法中所有的锁都由 Redis 节点来管理,如果其中一个节点发生故障,可能会导致整个系统无法正常工作。
    5. 竞争条件问题:Redlock 算法中多个客户端同时尝试获取同一个锁时,可能会导致竞争条件的发生。这种情况下可能会导致多个客户端都认为自己已经获取到了锁,从而导致数据不一致或其他问题的出现。
    6. 惊群问题: 是指在并发编程中,多个进程或线程同时等待同一个事件或资源的时候,可能会出现多个进程或线程同时被唤醒的情况,导致性能下降或资源浪费的问题。
  • ZooKeeper 在实践中存在一些问题,主要包括以下几点:

    • 性能问题:ZooKeeper 节点的数量有限,同时,每次获取锁都需要向 ZooKeeper 服务器发送请求,这会给服务器带来较大的负载。因此,在高并发场景下,使用 ZooKeeper 实现分布式锁可能会导致系统性能下降。
    • 可靠性问题:如果 ZooKeeper 服务器发生故障,可能会导致分布式锁的可靠性和一致性受到影响。为了避免这个问题,可以使用 ZooKeeper 的多个实例来实现高可用性和冗余备份。
    • 临时性问题:ZooKeeper 分布式锁是基于临时节点实现的,如果一个客户端获取到锁之后突然宕机或网络异常,那么其他客户端就无法释放该节点上的锁,从而导致死锁的情况。为了解决这个问题,可以使用心跳机制来保证节点的存活性,以及使用超时时间来避免死锁。
    • 长时间占用问题:如果一个客户端获取到锁之后长时间不释放,会导致其他客户端长时间等待,从而降低系统的可用性和性能。
  • 如果应用场景对于分布式锁的可靠性一致性要求较高,那么可以选择使用 ZooKeeper 实现的分布式锁;

  • 如果应用场景对于分布式锁的性能效率要求较高,那么可以选择使用 Redis 实现的分布式锁。

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

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

相关文章

关于SD webui 部署运行的一些坑

[Bug 1]: RuntimeError: Couldnt install gfpgan 可以先尝试: pip install gfpgan 不过是在虚拟环境venv下的 E:\stable-diffusion-webui\venv\Scripts\python.exe -m pip install gfpgan 如果还是无法安装gfpgan的原因是网络问题,就算已经科学上网…

maven 项目依赖加载不出来

1.依赖加载不出来,查看pom.xml放的位置是否对了 2.1下载mvn到本地,进行解压 2.2新建系统变量MAVEN_HOME,值直接指向安装目录D:\apache-maven-3.9.2 2.3path变量中增加:%MAVEN_HOME%\bin 2.4若仓库位置不在C盘用户下&#xff0…

SpringMVC对请求的处理流程

1.用户发起some.do请求 2.DispatcherServlet中央调度器接收请求some.do,把请求转交给处理器映射器  处理器映射器:SpringMVC框架中的一种对象,框架实现了HandlerMapping接口的类都叫映射器(多个) 处理器映射器的作用:根据请求&a…

Ajax加强(xhr、XML、JSON、xhr上传文件)

文章目录 一、XMLHttpRequest的基本使用1、 使用xhr发起GET请求2、了解xhr对象的readyState属性3、使用xhr发起带参数的GET请求4、查询字符串5、URL编码与解码6、使用xhr发起POST请求 二、数据交换格式1、XML(1)XML和HTML的区别(2&#xff09…

gma 1.1.6 | 2.0.0a1 (2023.05.14) 更新日志

从现在开始,gma 开始同步更新 gma 2 的前期预览版,并与 gma 1 的正式版同步发布。 gma 1.1.6 更新日志 新增 1、添加 3组 新的指北针样式。 修复 1、【map】高分辨栅格数据集内存溢出问题。   添加高分辨率栅格数据集且进行强制数据缩放时 偶现内存…

论文中文翻译——VulCNN An Image-inspired Scalable Vulnerability Detection System

本论文相关内容 论文下载地址——Web Of Science论文中文翻译——VulCNN An Image-inspired Scalable Vulnerability Detection System 文章目录 本论文相关内容前言VulCNN:一种基于图像的可扩展漏洞检测系统作者信息摘要CCS概念关键词ACM参考格式1 引言2 动机3 方…

软考A计划-真题-分类精讲汇总-第十八章(面向对象程序设计)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&am…

CorelDRAW2023最新中文版下载操作教程

CorelDRAW是一个功能强大的矢量绘图工具,也是国内外最流行的平面设计软件之一,它是平面设计和电脑绘画功能为一体的专业设计软件,被广泛应用于平面设计、广告设计、企业形象设计、字体设计、插图设计、工业造型设计、建筑平面图绘制、Web图形…

《终身成长》笔记三——失败挫折的意义

目录 经典摘录 成长型思维方式的人并非感觉不到挫折感,抑郁感,但会很快反应过来,并马上应对 关于能力和成就,我们有很多错误的想法,特别是我们总认为,是那些孤独、聪明的人突然间发明了了不起的东西 思维…

需要买apple pencil吗?比较好用的ipad手写笔

实际上,苹果Pencil和市面上常见的电容笔最大的不同之处在于,它们的重量和压感是不同的。但由于苹果Pencil价格较高,且平替电容笔的各项功能也在不断完善,因此,平替的使用逐渐取代了苹果Pencil。下面,我就给…

博途中S7-1200中DB块整体清零(非优化的DB)的方法演示

博途中S7-1200中DB块整体清零(非优化的DB)的方法演示 具体方法可参考以下内容: 如下图所示,博途中新建项目后,添加一个DB块,我这里以命名为DB112,并取消优化的块访问, 如下图所示,在该DB块中添加几个变量,编译该DB块后会出现具体的偏移地址, 如下图所示,添加一个…

Maven基础学习---1、Maven的作用、什么是Maven

1、Maven的作用 1.1 Maven作为依赖管理工具 1、jar包的规模 随着我们使用越来越多的框架,或者对框架封装程度越来越高,项目中使用的jar包也越来越多。项目中,一个模块里面用到上百个jar包时非常正常的。 比如下面的例子,我们只…

Java --- redis7的缓存淘汰策略

目录 一、redis内存查看与设置 二、redis的数据删除方式 三、redis缓存淘汰策略 一、redis内存查看与设置 查看redis最大占用内存: redis默认内存使用: 不设置最大内存大小或设置为0,在64位操作系统下不限制内存大小,32位操作系…

【Python 统计学习】零基础也能轻松掌握的学习路线与参考资料

Python 作为一种功能强大而且易于使用的编程语言,被广泛应用于数据科学和统计学习领域。如果你想要在这个领域有所成就,下面是 Python 统计学习学习路线的建议。 Python 基础知识 如果你还没有 Python 的基础知识,那么首先需要学习 Python 的…

博客园美化教程

博客园美化教程 一、进入管理>设置>勾选下面的JS权限,然后填写一下开通的理由等待管理员进行审核通过。 二、选择下面的博客皮肤 三、贴入以下CSS代码到自定义,并禁用CSS默认模板 *,.Cal{padding:0}::-moz-selection{background:#807dd4;color:#…

chatgpt-验证手机出错-您的帐户被标记为可能存在滥用行为

一、问题 问题显示:Your account was flagged for potential abuse. If you feel this is an error,please contact us at help.openai.com(您的帐户被标记为可能存在滥用行为,如果您认为这是一个错误,请联系我们 help.openai.co…

7.机器学习诊断法

怎样评估机器学习算法的性能? 利用机器学习诊断法来评估机器学习算法的性能。诊断法是一种测试法,通过这种测试能够了解算法在哪里出了问题,这也能够告诉我们要想改进一种算法的效果、什么样的尝试才是有意义的。 7.1 评估假设 评价算法学…

【数据结构】树,二叉树,满二叉树,完全二叉树的定义和二叉树的基本操作

🎊专栏【数据结构】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【勋章】 大一同学小吉,欢迎并且感谢大家指出我的问题🥰 目录 ⭐树 🏳️‍🌈定义 🏳️‍…

祝贺!Coremail连续4年入选中国网络安全市场全景图

5月16日,数说安全正式发布《2023年中国网络安全市场全景图》(以下简称“全景图”)。作为国内头部电子邮件产品与解决方案提供商,Coremail凭借着出色的产品技术和服务,连续4年入选“邮件安全”领域,体现行业…

计算机视觉 day 93 学习像素级膨胀滤波的高效率单图像去噪

学习像素级膨胀滤波的高效率单图像去噪 1 Introduction3 Methodology3.1 逐像素图像滤波解调3.2 可学习像素级膨胀滤波Kernel prediction network(核预测网络)Multi-dilated image filtering and fusion(多扩张图像滤波与融合) 3.…