Redis——RedLock、Zookeeper及数据库实现分布式锁
在分布式系统中,实现分布式锁是确保数据一致性和防止并发问题的重要手段。以下是使用Redis的RedLock算法、ZooKeeper以及数据库实现分布式锁的基本概念和步骤:
1. Redis的RedLock算法
Redis的RedLock算法是Redis官方推荐的一种分布式锁实现方式,它基于多个Redis节点来避免单点故障。
实现步骤:
- 获取多个Redis主节点:首先,你需要一个Redis主节点的集合。这些节点应该是完全独立的,并且它们之间不存在主从复制关系。
- 获取锁:客户端尝试在多个Redis节点上获取锁。为了获取锁,客户端在每个节点上执行以下操作,使用相同的key和唯一的value(例如当前时间戳和客户端ID):
- 使用SET命令设置key,value为唯一值,并且设置过期时间(TTL)。这个命令应该使用NX(仅当key不存在时设置)选项。
- 如果SET命令成功,那么客户端已经获取了该节点上的锁。
- 计算成功获取锁的节点数:如果客户端在超过半数(N/2+1,其中N是Redis节点总数)的节点上成功获取了锁,那么客户端就成功获取了分布式锁。
- 释放锁:当客户端完成操作或需要释放锁时,它应该向所有Redis节点发送删除key的命令。
优点:
- 基于多个Redis节点,避免了单点故障。
- 锁的获取和释放过程相对简单。
缺点:
- 需要多个Redis节点。
- 如果Redis节点响应慢或网络延迟,可能会导致锁的获取失败。
2. ZooKeeper实现分布式锁
ZooKeeper是一个高性能的分布式协调服务,它提供了分布式锁的实现。
实现步骤:
- 创建临时有序节点:客户端在ZooKeeper中创建一个临时有序节点(ephemeral sequential node)。这个节点是临时的,当客户端与ZooKeeper的连接断开时,该节点会被自动删除。
- 判断是否获得锁:客户端检查自己创建的节点是否是当前最小的节点(即排在所有节点序列的最前面)。如果是,那么客户端就获得了锁。
- 等待或重试:如果客户端创建的节点不是最小的节点,那么它会等待或进行重试。等待的方式可以是监听前一个节点的删除事件,一旦前一个节点被删除,客户端就检查自己是否成为了最小的节点。
- 释放锁:当客户端完成操作或需要释放锁时,它只需要删除自己在ZooKeeper中创建的临时节点即可。
优点:
- ZooKeeper提供了强一致性的保证。
- ZooKeeper是一个成熟的分布式协调服务,具有广泛的应用和社区支持。
缺点:
- 需要部署和运行ZooKeeper集群。
- 相对于Redis,ZooKeeper的锁获取和释放过程可能更复杂。
3. 数据库实现分布式锁
数据库也可以用来实现分布式锁,但这种方式通常不如Redis和ZooKeeper高效。
实现步骤:
- 创建锁表:在数据库中创建一个锁表,该表至少包含一个字段用于表示锁的key,以及一个字段用于表示锁的持有者。
- 获取锁:客户端尝试在锁表中插入一条记录,key为所需的锁,持有者为当前客户端的唯一标识。如果插入成功,那么客户端就获得了锁。为了防止多个客户端同时插入同一条记录,可以使用数据库的乐观锁或悲观锁机制。
- 判断是否获得锁:如果插入失败(例如因为存在相同的key),那么客户端就需要等待或进行重试。
- 释放锁:当客户端完成操作或需要释放锁时,它只需要删除自己在锁表中插入的记录即可。
优点:
- 可以利用现有的数据库系统。
缺点:
- 数据库的锁获取和释放操作可能涉及网络I/O和磁盘I/O,效率较低。
- 在高并发场景下,数据库可能成为性能瓶颈。
- 需要编写复杂的SQL语句和数据库事务来确保数据的一致性和锁的正确性。
相关文章:
Redis——RedLock、Zookeeper及数据库实现分布式锁
在分布式系统中,实现分布式锁是确保数据一致性和防止并发问题的重要手段。以下是使用Redis的RedLock算法、ZooKeeper以及数据库实现分布式锁的基本概念和步骤: 1. Redis的RedLock算法 Redis的RedLock算法是Redis官方推荐的一种分布式锁实现方式&#x…...
OpenSSL自签证书并基于Express搭建Web服务进行SSL/TLS协议分析
OpenSSL自签证书并基于Express搭建Web服务进行SSL/TLS协议分析 起因 最近在学习安全协议,大多数实验都是基于Windows下IIS,或者Linux下nginx搭建的Web服务,搭建环境和编写配置文件比较麻烦。而且我有多个不同环境的设备,折腾起来…...
记录一次 vue2 前端项目整合过程
整合成功效果图 具体说明: 项目A是现在的vue2前端项目,项目B是一个开源的工作流前端,项目后端代码已经整合了,就不多提了。这里主要记录下前端整合的过程和思路。 1、开源工作流里面的功能,拷贝到自己对应的vue2项目里…...
物联网五层架构分析
物联网五层架构分析 随着科技的迅速发展,物联网(IoT)作为日常生活中不可或缺的一部分,已融入人们的生活和工作中。物联网五层架构,包括感知层、网络层、数据层、应用层和业务层,扮演着关键的角色。 感知层 …...
【Java EE】多线程(三)线程状态
📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更…...
FFmpeg常用API与示例(一)—— 工具库篇(av_log、AVDictionary、avio)
工具层 1.av_log 可以设置日志的级别,这个看看名字就明白了,也不用过多的解释。 AV_LOG_PANICAV_LOG_FATALAV_LOG_ERRORAV_LOG_WARNINGAV_LOG_INFOAV_LOG_VERBOSEAV_LOG_DEBUG void test_log() {/ av_register_all();AVFormatContext *pAVFmtCtx NU…...
日志的基本用法
目标 1. 掌握如何设置日志级别 2. 掌握如何设置日志格式 3. 掌握如何将日志信息输出到文件中 1. logging模块 Python中有一个标准库模块logging可以直接记录日志 1.1 基本用法 import logging logging.debug("这是一条调试信息") logging.info("这是一条…...
什么是页分裂、页合并?
数据组织方式 在InnoDB存储引擎中,表数据都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表(index organized table IOT)。 行数据,都是存储在聚集索引的叶子节点上的。而我们之前也讲解过InnoDB的逻辑结构图: 在I…...
软件2班20240513
第三次作业 package com.yanyu;import java.sql.*; import java.util.ResourceBundle;public class JDBCTest01 {public static void main(String[] args) {ResourceBundle bundle ResourceBundle.getBundle("com/resources/db");// ctrl alt vString driver …...
嵌入式学习-时钟树
时钟树 时钟分类 时钟树框图 LSI与LSE HSI、HSE与PLL 系统时钟的产生 AHB、APBx的时钟配置 相关寄存器 寄存器部分的细节内容请参考手册。 相关库函数...
对博客系统基本功能进行自动化测试(Junit + Selenium)
环境搭建: 浏览器: 本次测试使用Chrome浏览器在jdk的bin目录下安装对应浏览器驱动(尽量选择与浏览器版本相近的驱动)chromedriver.storage.googleapis.com/index.htmlJunit依赖: <!-- https://mvnreposit…...
《换你来当爹》:AI驱动的养成游戏,探索虚拟亲子关系的新模式
AI技术如何重塑我们对游戏互动的认知 在人工智能技术的浪潮下,一款名为《换你来当爹》的AI养成游戏,以其创新的互动模式和个性化体验,吸引了游戏爱好者的目光。这款游戏利用了先进的LLM技术,通过AI实时生成剧情和图片,…...
在idea中使用vue
一、安装node.js 1、在node.js官网(下载 | Node.js 中文网)上下载适合自己电脑版本的node.js压缩包 2、下载完成后进行解压并安装,一定要记住自己的安装路径 一直点击next即可,这部选第一个 3、安装成功后,按住winR输入…...
Linux系统编程:进程控制
1.进程创建 1.1 fork函数 fork()通过复制调用进程来创建一个新进程。新进程称为子进程,是调用进程的精确副本 进程,但以下几点除外: 子进程有自己的PID,此PID与任何现有进程组的ID不匹配子进程的父进程ID…...
Android 异常开机半屏重启代码分析
Android 的稳定性是 Android 性能的一个重要指标,它也是 App 质量构建体系中最基本和最关键的一环;如果应用经常崩溃,或者关键功能不可用,那显然会对我们的留存产生重大影响所以为了保障应用的稳定性,我们首先应该树立…...
Kafka从0到消费者开发
安装ZK Index of /zookeeper/zookeeper-3.9.2 下载安装包 一定要下载-bin的,不带bin的是源码,没有编译的,无法执行。-bin的才可以执行。 解压 tar -zxvf apache-zookeeper-3.9.2-bin.tar.gz 备份配置 cp zoo_sample.cfg zoo_sample.cfg-b…...
01-项目功能,架构设计介绍
稻草快速开发平台 开发背景就是通过此项目介绍使用SpringBoot Vue3两大技术栈开发一个拥有动态权限、路由的前后端分离项目,此项目可以继续完善,成为一个模板为将来快速开发做铺垫。 实现功能 开发流程 通过命令构建前端项目在VSCode中开发ÿ…...
bvh 好用强大的播放器源码
目录 效果图: 显示旋转角度: 显示骨骼名称 下载链接: 可以显示骨骼名称,旋转角度,自适应大小,支持3维npz数据可视化 python实现,提供源代码,修改和完善很方便。 根据3维npz生成…...
安阳在线知识付费系统,培训机构如何进行课程体系的设置?
校外培训不管是从招生还是课程体系都是截然不同的,在课程体系设置上,不同的层次设计也就不同。课程体系设计在功能诉求上可以分为入门课、核心课、高利润课、种子课四个类别。下面为大家介绍一下。 1、入门课 “入门课”就是最易、最省、最少障碍的满足家…...
网络编程:服务器模型-并发服务器-多进程
并发服务器概念: 并发服务器同一时刻可以处理多个客户机的请求 设计思路: 并发服务器是在循环服务器基础上优化过来的 (1)每连接一个客户机,服务器立马创建子进程或者子线程来跟新的客户机通信 (accept之后…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...
