当前位置: 首页 > news >正文

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

上一篇 :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 实现的分布式锁。

相关文章:

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

上一篇 :26.分布式服务框架Dubbo面试题简析 1. redis 分布式锁 官方叫做 RedLock 算法,是 redis 官方支持的分布式锁算法。这个分布式锁有 3 个重要的考量点: 互斥(只能有一个客户端获取锁)不能死锁容错(…...

运行时栈帧结构与方法调用

1 运行时栈帧结构 Java虚拟机以方法作为最基本执行单元,“栈帧”则是用于支持虚拟机进行方法调用和方法执行背后的数据结构。栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。 1.1 局部变量表 局部变量表的容量以变量槽为最小单位。 Java…...

VSCode +gdb+gdbserver远程调试arm开发板

一、下载编译器 从ARM官网下载gcc-arm编译器,编译器中自带gdb和gdbserver,可以省去自己编译。 注:gdb是电脑端程序,gdbserver是arm开发板程序 arm官网链接:https://developer.arm.com/downloads/-/arm-gnu-toolchain-d…...

阿里云大学考试python中级题目及解析-python高级

阿里云大学考试python高级题目及解析 1.以上代码输出结果为 a [1,2,3,None,(),[],] print(len(a))A.4 B.5 C.6 D.syntax error C 列表中元素可以存储任意数据类型 2.将字符串s 中的字母a替换为字母,以下代码正确的是 A.s.swap(“b”,“a”) B.s.r…...

基于FPGA的车牌识别

基于FPGA进行车牌识别 基于FPGA进行车牌识别 1. 文件说明2. 程序移植说明3. 小小的编程感想 本项目的原理讲解视频已经上传到B站“基于FPGA进行车牌识别”。 本项目全部开源,见我本人的Github仓库“License-Plate-Recognition-FPGA”。 1. 文件说明 小技巧&…...

Qt - 进程/线程 补充进阶

Qt - 进程/线程 补充进阶 多线程quit / eixt / terminate QThread例子tdicethread 类.h.cpp widget 类.h.cpp 线程同步 多线程 quit / eixt / terminate quit 应用程序或线程安全的取消事件处理队列的执行,并随后使线程退出(如果只希望结束线程并保证它…...

spring笔记

spring 和 springboot的区别 自动配置原理 beanFactory接口和ApplicationContext接口 两个都是 IOC 容器 ApplicationContext接口是BeanFactory接口实现类的子类 功能: ApplicationContext扩展BeanFactory BeanFactoryApplicationContext控制反转国际化支持 …...

最大熵模型

最大熵模型(maximum entropy model)由最大熵原理推导实现 最大熵原理 最大熵原理是概率模型学习的一个准则。最大熵原理认为,学习概率模型时,在所有可能的概率模型(分布)中,熵最大的模型时最好…...

微服务中网关的配置

一、添加 Spring Cloud Gateway 依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId> </dependency>二、配置网关路由 在application.yaml中配置如下内容&#xff1a…...

Linux基本指令实现4及热键指令详解

目录 Linux热键补充&#xff1a; 1.bc指令&#xff1a; Tab键的智能补充&#xff1a; ctrlc键&#xff1a; uname指令&#xff1a; lscpu指令&#xff1a; lsmem指令&#xff1a; df -h指令&#xff1a; 关机指令&#xff1a; 扩展指令&#xff1a; Linux热键补充&#…...

系统调用与API

系统调用介绍 什么是系统调用 为了让应用程序有能力访问系统资源&#xff0c;也为了让程序借助操作系统做一些由操作系统支持的行为&#xff0c;每个操作系统都会提供一套接口&#xff0c;以供应用程序使用。系统调用涵盖的功能很广&#xff0c;有程序运行所必需的支持&#xf…...

OpenPCDet系列 | 5.4.1 DenseHead中的AnchorGenerator锚框生成模块

文章目录 AnchorGenerator模块AnchorGenerator.generate_anchors函数 AnchorGenerator模块 首先&#xff0c;根据点云场景将其划分为一个个grid&#xff0c;这个grid size是可以通过配置文件设定的点云场景方位和voxel大小计算出来的。 POINT_CLOUD_RANGE: [0, -39.68, -3, 6…...

【开发者指南】如何在MyEclipse中使用HTML或JSP设计器?(上)

MyEclipse v2022.1.0正式版下载 一、HTML & JSP 可视化设计器 本文简要介绍了 MyEclipse HTML 和 JSP Web 设计器的概念、功能和基本操作过程。这两个设计器具有相似的功能和相同的操作模型&#xff0c;但本文为专门针对其类型的内容。本文档中的示例是使用 MyEclipse HT…...

Node开发Web后台服务

简介 Node.js 是一个基于Google Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型&#xff0c;使其轻量又高效。Node.js 的包管理器 npm&#xff0c;是全球最大的开源库生态系统。 能方便地搭建响应速度快、易于扩展的网络应用&#…...

Linux下对mmap封装使用

Linux下对mmap封装使用 1、mmap简介2、Linux下mmap使用介绍2.1、mmap函数2.2、munmap函数 3、对mmap进行封装4、对封装类MEM_MAP进行测试5、mmap原理6、源代码下载 1、mmap简介 mmap即memory map&#xff0c;是一种内存映射文件的技术。mmap可以将一个文件或者其它对象映射到进…...

深入了解云计算:发展历程、服务与部署模型、未来趋势与挑战

开篇博主 bluetata 的观点&#xff1a;PaaS 服务必将是未来10年云计算权重最高的趋势&#xff08;05/02/2023 15:32&#xff09; 文章目录 一、前言二、认识了解云计算2.1 什么是云计算2.1.1 维基百科上的云计算定义2.1.2 NIST 标准云计算定义2.1.3 如果被面试如何解释云计算 2…...

使用乐鑫 Web IDE 助力物联网开发

乐鑫 Web IDE 是基于 Eclipse Theia 的框架&#xff0c;支持 ESP-IDF VS Code 插件同时具备多项辅助工具。您可以观看我们在 Espressif DevCon22 上的演示视频​​​​​​​&#xff0c;了解它的实际应用。 【乐鑫开发者大会-21】搭载 ESP-IDF Visual Studio Code 插件的乐鑫 …...

Maven(5)---Maven的部署和发布

Maven的部署和发布 在前面的博客中&#xff0c;我们已经学习了Maven的基础知识、依赖管理、插件和生命周期&#xff0c;以及多模块项目管理。本篇博客将介绍Maven的部署和发布功能。 什么是部署和发布 在软件开发过程中&#xff0c;部署和发布是非常重要的环节。部署是指将软…...

内网渗透之权限维持-黄金白银票据隐藏账户远控-RustDeskGotoHTTP

0x01权限维持-隐藏用户 CreateHiddenAccount工具 CreateHiddenAccount -u test -p Psswrd用户管理能查看到&#xff0c;命令查看看不到&#xff0c;单机版无法删除(不在任何组)&#xff0c;域环境(在administrator组中)可以删除 0x02权限维持-黄金白银票据 ⻩⾦票据⽣成攻…...

动态规划——带权活动选择

带权活动选择Time Limit: 3000 MSMemory Limit: 1000 KB Description 给定n个活动&#xff0c;活动ai表示为一个三元组(si,fi,vi)&#xff0c;其中si表示活动开始时间&#xff0c;fi表示活动的结束时间&#xff0c;vi表示活动的权重, si<fi。带权活动选择问题是选择一些活…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】&#xff1a;开启编程世界的奇妙冒险 嘿&#xff0c;各位编程小白探险家&#xff01;欢迎来到 C# 的奇幻大陆&#xff01;今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类&#xff01;别害怕&#xff0c;跟着我&#xff0c;保准让你轻松搞…...