分布式锁 redis与zookeeper

news2024/11/14 21:09:44

redis实现分布式锁

原理

基于redis命令setnx key value来实现分布式锁的功能,只有当key不存在时,setnx才可以设置成功并返回1,否则设置失败返回0。

方案1:

在这里插入图片描述

方案1存在的问题

假如在加锁成功,释放锁之前,服务器宕机了,这个锁就无法释放了,其他线程就永远无法获取到锁了。

改进之后

方案2

在这里插入图片描述

方案2存在的问题

获取锁和设置过期时间是2个命令,两次网络IO和redis交互,不具备原子性,可能出现获取锁成功之后 设置过期时间之前服务器宕机,导致其他线程永远都获取不到锁的现象。

方案3

1、将获取锁和设置过期时间放在lua脚本里面执行,lua脚本可以保证多个命令原子性的执行。
2、redis提供了其他命令在setnx的同时设置过期时间,分别如下所示:

  • set key value PX 多少毫秒 NX
  • set key value EX 多少秒 NX
    在这里插入图片描述
方案3存在的问题

锁过期释放了,但是业务仍没有执行完,等到执行完业务并释放锁的时候,释放的其实是其他线程获取到的锁。

  • 线程A获取到了锁,并设置过期时间10s。
  • 当过了10秒后,线程A仍然没有执行完,但是此时线程A获取到的锁已经达到了过期时间,导致锁被释放了。
  • 此时线程B获取到了锁,并执行业务方法
  • 线程A业务方法执行完,并执行释放锁逻辑(此时释放的是线程B获取到的锁)
  • 由于锁被释放,线程C也获取到了锁,并执行业务,此时线程B、线程C都获取到了同一个锁,并执行相应的业务。
方案4

在这里插入图片描述

方案4存在的问题

方案4中 判断key1的value1是否等于设置的值uuid,如果是则删除,否则不执行删除逻辑,由于是2个命令,不具备原子性导致可能出现以下场景

  • 线程A成功获取锁key1,设置key1的value为uuid1,并设置过期时间10秒。
  • 线程A执行完业务逻辑,准备删除锁
  • 线程A获取到key1的value uuid1。
  • 此时线程A的锁key1刚好到了过期时间
  • cpu时间片切换,线程A停止执行,线程B开始执行
  • 线程B尝试获取分布式锁key1(由于上面线程A设置的锁已经到了过期时间,所以此处可以获取成功)
  • cpu时间片切换,线程A继续执行,由于锁的value == uuid1,所以开始删除锁(此时删除的是线程B设置的分布式锁)。导致出现了删除其他线程设置的分布式锁。
方案五

在这里插入图片描述

方案5存在的问题

当前仍存在锁时间达到了过期时间,但是线程没执行完的问题。
如何解决呢?
watch dog机制(Redisson底层就是基于watch dog机制来实现分布式锁的自动续期,当未设置过期时间时,会默认设置30秒,并起一个看门狗线程,每十秒去检测一次,如果当前线程仍然在执行,就自动续期,当然,如果手动设置了过期时间,就不会自动续期了)。
在这里插入图片描述

方案五存在的问题

redis集群的场景下,redis-master节点设置成功了,但是redis-slave节点未设置成功,如下所示:

  • 当前redis集群有三个节点,分别是redis-master、redis-slave-a、redis-slave-b
  • 线程A尝试获取分布式锁,此时在redis-master上设置key1成功。
  • redis集群采用异步主从复制,但是redis-master上设置的key内容还没有同步到slave时,redis-master节点就宕机了。
  • 此时集群重新选举,因此redis-slave-a变成了mater节点
  • 此时有线程B尝试获取分布式锁key1,由于新的master节点上没有设置key1,因此线程B设置锁成功。
  • 当前线程A和线程B就都持有了分布式锁并执行业务逻辑。
方案6

如何解决方案五仍然存在的问题呢?
使用redlock(红锁)算法,这是一个专门用于解决这种问题的分布式锁协议。
redlock:不能只在一个redis实例上加锁,应该是在多个redis实例上创建锁,当创建成功数量达到(n/2 + 1)时,才能认为加锁成功

在这里插入图片描述
以上方式实现复杂、性能差、运维繁琐。
我们的redis是AP高可用思想、如果要实现强一致性,应该使用CP思想的zookeeper来实现,解决主从一致性问题。
C:Consistency;一致性
A:Availabilit;可用性
P:Partition Tolerance;分区容错性

zookeeper实现分布式锁

区别

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

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

相关文章

面向对象08:什么是多态

本节内容视频链接:面向对象12:什么是多态_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV12J41137hu?p71&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 Java中的多态是面向对象编程的一个重要概念,‌它允许不同类型的对象对…

jenkins安装及介绍

Cl:持续集成 CD:持续部署 插件:丰富的插件,可以满足99%的需求,还可以二次开发插件来满足需求 Jenkins能干嘛 1.集成第三方工具的使用,jenkins是一个集大成者,它集成了1000多个插件,几乎把所有知名的工具都集成到ienkin…

职场达人必备:2024年PDF转PPT工具精选指南

PDF文件有卓越的兼容性和安全性,;而PPT则以其强大的演示能力。然而,在日常的工作与学习场景中,我们时常面临将PDF内容转化为PPT格式的需求,以便更好地进行展示与编辑。那么,究竟该如何高效地将PDF转换成PPT…

多维系统下单点登录之整理解决方案

从淘宝天猫的单点登录说起 1.1 SSO单点登录 概述 随着互联网大数据不断发展,应用服务的不断增多,单点登录越来越能够凸显其作用。单点 登录SSO(Single Sign On),顾名思义就是单个节点登录,全局使用。是目前最为流行的统一登录 解…

36 使用LDT(2)

首先是 定义 两个任务的LDT表 这是再GDT表中的选择子 首先是宏定义:这里的 0x4 , 3 先不用管 这里 一个task 一个LDT表 然后是在GDT表中 增加关于LDT的描述。 这里需要加上一个图。 还是这个图 然后是在 TSS表中,设置LDT的表的地址。 然后是更改 TSS表中…

AI的未来已来:GPT-4商业应用带来的无限可能

随着人工智能技术的快速发展,OpenAI于2023年3月15日发布了多模态预训练大模型GPT-4,这一里程碑式的进步不仅提升了AI的语言处理能力,还拓展了其应用范围。本文将深入探讨GPT-4的技术进步、商业化进程、用户体验改善、伦理和社会影响&#xff…

UR机械臂的ROS驱动安装官方教程详解——机器人抓取系统基础系列(一)

UR机械臂的ROS驱动安装配置官方教程详解——机器人抓取系统基础系列(一) 前言1 准备工作2 电脑安装驱动3 机器人端设置4 电脑和机器人的通讯IP设置5 启动机械臂的ROS驱动6 MoveIt控制机械臂总结 前言 本文在官方Github教程的基础上,详细阐述…

详细说明:向量数据库Faiss的搭建与使用

当然,Faiss(Facebook AI Similarity Search)是一个用来高效地进行相似性搜索和密集向量聚类的库。它能够处理大型数据集,并且在GPU上的性能表现尤为出色。下面详细介绍Faiss的搭建与使用。 1. 搭建Faiss 1.1 安装依赖包 首先&a…

Hadoop集群运维管理

Hadoop集群运维管理 一、Hadoop 集群进程管理1.1 NameNode 守护进程管理1.2 DataNode 守护进程管理1.3 ResourceManager 守护进程管理1.4 NodeManager 守护进程管理 二、Hadoop 集群运维技巧2.1 查看日志2.2 清理临时文件2.3 定期执行负载均衡2.4 文件系统检查2.5 元数据备份 三…

Redis的持久化介绍及其Linux配置介绍

1. Redis的持久化 Redis的数据都是存储在内存中,为了数据的永久保存,需要把数据同步到硬盘上,这个过程就叫做持久化. Redis的持久化存在有两种方式: rdb方式,aof方式,这两种方式可以单独使用,也可以综合使用. rdb持久化方式: 是在指定的时间间隔写入硬盘aof持久化方式:是以日…

【Python使用】嘿马python基础入门全体系教程第5篇:容器:字符串、列表、元组、字典,<1>添加元素(“增“append

本教程的知识点为:计算机组成 计算机是由什么组成的? 1. 硬件系统: 2. 软件系统: 目标 运算符的分类 1. 算数运算符 2. 赋值运算符 3. 复合赋值运算符 判断语句和循环语句 if嵌套 1. if嵌套的格式 2. if嵌套的应用 if嵌套执行流程…

链家web安全面试经验分享

吉祥知识星球http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247485367&idx1&sn837891059c360ad60db7e9ac980a3321&chksmc0e47eebf793f7fdb8fcd7eed8ce29160cf79ba303b59858ba3a6660c6dac536774afb2a6330#rd 《网安面试指南》http://mp.weixin.qq.com/s…

MyBatis使用:动态SQL

1、目标 本文的主要目标是使用MyBatis的动态SQL 2、最好使用Param注解 Data public class BaseEntity {protected String id;protected Integer createUserId;protected String createDateTime;}Data public class News extends BaseEntity {private String title;}RestCont…

【C++ Primer Plus习题】5.8

问题: 解答: #include <iostream> #include <cstring> using namespace std;#define SIZE 20int main() {char words[20];char done[] "done";int count 0;while (true){cout << "请输入单词:" << endl;cin >> words;if …

Open3D 最近点约束的体素滤波(35)

Open3D 最近点约束的体素滤波(35) 一、算法介绍二、算法步骤三、具体代码四、实现效果一、算法介绍 最近点约束的体素滤波,是指在每个体素中,选择距离体素中心最近的原始点作为滤波结果,这样保留的是原始点位置。相比于体素滤波的重心点重新计算,或者八叉树体素中心,更加…

进阶岛 茴香豆:企业级知识库问答工具

一、任务介绍 在 InternStudio 中利用 Internlm2-7b 搭建标准版茴香豆知识助手&#xff0c;并使用 Gradio 界面完成 2 轮问答&#xff08;问题不可与教程重复&#xff0c;作业截图需包括 gradio 界面问题和茴香豆回答&#xff09;。知识库可根据根据自己工作、学习或感兴趣的内…

【复旦微FM33 MCU 外设开发指南】外设篇1——GPIO

前言 本系列基于复旦微FM33系列单片机的DataSheet编写&#xff0c;旨在提供一些开发指南。 本文章及本系列其他文章将持续更新&#xff0c;本系列其它文章请跳转【复旦微FM33 MCU 外设开发指南】总集篇 本文章最后更新日期&#xff1a;2024/08/25 文章目录 前言GPIO工作时钟…

PowerShell 一键配置IP

前言 实现一键更改Windows 网卡IP,子网,网关,dns,重命名网卡,获取的接口索引名称,获取接口名称,刷新组策略,刷新系统,脚本可重复配置,,以下环境我是两个网卡配置IP 前提条件 开启wmi,配置网卡,参考 创建更改网卡脚本 实验环境,两个网卡,清除默认,重命名(配置)…

程序员的双重挑战:高效编码与持续学习

在快速变化的编程世界中&#xff0c;程序员们面临着双重挑战&#xff1a;一方面要高效完成日常编码任务&#xff0c;另一方面需要不断学习新技术和深化专业知识&#xff0c;以适应日益复杂的项目需求。如何在这两者之间找到平衡&#xff0c;是许多程序员都感到困惑的问题。本文…

韩国云主机玩游戏性能怎么样

韩国云主机玩游戏性能怎么样&#xff1f;韩国云主机作为高性能的计算服务&#xff0c;为全球游戏玩家提供了一种新的游戏体验方式。用户所关注的韩国云主机在游戏性能方面的表现&#xff0c;可以从多个维度进行详细评估。下面将具体分析韩国云主机用于玩游戏的性能特点&#xf…