分布式锁演变思路(基于Redis)

Redis实战之 分布式锁 重入问题:重入问题是指 获得锁的线程可以再次进入到相同的锁的代码块中,可重入锁的意义在于防止死锁,比如HashTable这样的代码中,他的方法都是使用synchronized修饰的,假如他在一个方法内,调用另一个方法,那么此时如果是不可重入的,不就死锁了吗?所以可重入锁他的主要意义是防止死锁,我们的synchronized和Lock锁都是可重入的。不可重试:是指目前的分布式只能尝试一次,我们认为合理的情况是:当线程在获得锁失败后,他应该能再次尝试获得锁。 阅读详情

简易版本

最基本的要求就是保证唯一性。
这里的唯一性是指线程A加锁后,线程B对同一把锁加锁不会产生新的锁数据。
那么redis里面的过程就是:使用redis命令setnx(set if not exist),即只能被一个客户端占坑,如果redis实例存在唯一键,如果再想在该key上设置值,就会被拒绝。业务执行成功后,执行 del命令删除锁。

释放固定锁

如果两个线程在redis中加锁对应的value为同一个值,就有可能出现下面的情况:

  1. 客户端1获取锁成功,设置的value为100。
  2. 客户端1在某个操作上阻塞了很长时间。
  3. 过期时间到了,锁自动释放了。
  4. 客户端2尝试获取锁,并且最终获取成功。
  5. 客户端1从阻塞中恢复过来,释放掉了客户端2持有的锁。

所以,可以设置一个随机字符串(比如用机器id+线程id)作为value,它保证了一个客户端释放的锁必须是自己持有的那个锁。

增加过期时间

上面这个版本存在的问题就是,释放锁需要客户端的操作,如果此时客户端突然挂了,就没有释放锁的操作了,其他客户端想要重新加锁就加不了了,从而导致死锁。所以利用redis的 expire 给锁设置过期时间。

加锁和超时时间的设置需要setnx和expire两个命令来完成操作,如果在setnx和expire两次命令之间,客户端突然挂掉,这时又无法释放锁,且又回到了死锁的问题。可以使用set 扩展命令 set k v ex 5 nx 来实现 或者用 lua脚本在进行多步命令。

执行超时问题

客户端获取锁后设置超时时间为1分钟,但是执行耗费了2分钟,那么加锁1分钟后锁就释放了其他人就能获取到锁。可以使用定时任务进行锁的超时时间的重置 类似的 redisson 的看门狗线程。

锁的可重入问题

可以使用hash表存储,hkey 为定义的锁名称,然后里面的key为机器+线程ID,v为重入次数。加锁的时候会判断 hkey 是否存在,不存在新建。重入的时候判断 hkey 对应的线程 key 是否存在,存在 v + 1。

主从问题

由于单节点redis存在宕机风险,所以一般会采用主从的部署形式。主从模式下,主节点宕机,但是数据没有复制到从节点,则可能出现问题:A 在主节点上锁,主节点挂了,sentinel 重新选举了主节点,则B可能会加锁成功。

红锁

一种实现方式,比如有5个节点,不是主从和集群关系,加锁时,获取到其中半数以上就算成功,失败的需要将之前加锁的删除。
但是这种方案也存在一定问题:

  • 如果节点组中有节点宕机,但是没有把锁数据持久化,可能出现重复加锁
    如:A B C 节点,server1获取到 A B (C给 server2 获取,所以没获取成功) 获取锁成功
    B 宕机重启,但是锁没有持久化 那么重启后 server2可以加锁 B C 就重复获取锁了
    默认情况Redis AOF持久化是每秒写一次磁盘 可以设置每次修改数据都 fsync,但是这样会降低性能,而且即使执行了fsync也有可能丢失数据
    有人提出延迟重启,就是redis服务挂了不重启,而是过上很久才重启
  • 机器之间时间依赖严重,如果redis组中时钟错乱也是会有问题
  • 由于需要在多个节点加锁,加锁时间增加

在代码编写的时候,其实还要考虑很多情况,比如redis连接的释放、连接池、本地的性能等。所以,基于go实现了一套
https://github.com/oDevilo/redislock

Redis实现分布式锁 1. 为什么需要分布式锁?我们都知道,以上情况,,此时就2. 单机锁 & 分布式锁的定义:3. 分布式锁应该具备哪些条件?4. 分布式锁都有哪些主流的实现方案?分布式锁的核心是实现多线程之间互斥,而满足这一点的方式有很多,常见的有三种:补充:Zookeeper实现分布式锁的思路实现分布式锁的核心思路5. 如何用 Redis 实现分布式锁的?Redis本身可以被多个客户端访问,正好就是一个共享存储系统,可以用来保存分布式锁,而且Redis的读写性能高,可以应对高并发的锁操作场景。 阅读详情

相关推荐

T12 电烙铁简单程序逻辑

通过分析就可以知道,发热丝本身即是发热体,也是热偶的工作端。怎么可能是热电动势呢,确实,但不要忘了T12-OUTPUT端的电压是PWM波,理论上是有单片机PWM电压为0 v时的,而T12-OUTPUT端的电压此时也应为0。在T12烙铁头中,PID控制算法通过监测温度传感器的输出,计算当前温度与设定温度之间的差异,并根据这一差异调节加热功率,以实现烙铁头温度的精确控制。这段代码实现了一个简单的增量式PID控制器,通过计算当前温度与期望温度之间的差异以及历史偏差值,调节输出控制量,实现对温度的精确控制。

hgkhjkljnl的博客 1万+

分布式锁的演进之路:从简单到复杂的技术变革

例如,通过Istio的流量控制和加密功能,可提高分布式锁在不同微服务之间通信的稳定性和保密性,为分布式锁在复杂云原生架构中的应用提供更好的支持。从早期简单的基于数据库和文件系统的实现,到基于缓存、分布式共识算法的多样化方案,再到云原生时代与容器编排、服务网格等技术的融合,分布式锁的性能、可靠性和功能不断提升,以适应各种复杂的分布式应用场景,持续为分布式系统的稳定运行和高效发展提供支撑。基于Raft实现的分布式锁在一些对一致性和性能有特定要求的分布式系统中得到应用,进一步丰富了分布式锁的技术生态。

2501_91371741的博客 452

【机器学习(一)】从零到一:用sklearn构建你的第一个机器学习项目

本文为机器学习新手提供了一个完整的端到端实战指南。通过使用Python的scikit-learn库,以经典的鸢尾花数据集为例,详细演示了从环境搭建、数据探索、预处理、模型训练与评估,到超参数调优和模型保存的全流程。文章旨在帮助读者快速构建第一个机器学习项目,掌握核心工作流和工程实践。

weixin_29070861的博客 469

Redis分布式锁 — 五种演进方案

分布式锁是一种在分布式系统中用于协调多个节点或进程之间对共享资源进行访问的机制。本文通过Redis实现对分布式锁的运用,并加以不同的版本进行说明。

m0_62985615的博客 350

从医疗成像到工业检测:CMOS图像传感器NIR技术的最新应用案例解析

本文深入解析了CMOS图像传感器NIR技术在医疗成像和工业检测中的最新应用案例。通过提升量子效率至70%,NIR技术实现了血管可视化、材料缺陷检测等突破性进展,显著提高了医疗诊断精度和工业质检效率。文章还探讨了系统集成关键考量和前沿发展趋势。

weixin_30879169的博客 90

UE5摄像机抖动全攻略:从Perlin噪点到Sequence实战(附参数调优技巧)

本文深入解析UE5摄像机抖动技术,从Perlin噪点算法到CameraShakeBase蓝图应用,再到Sequence高级控制,提供全面的参数调优技巧。涵盖战斗、爆炸等场景的预设参数,帮助开发者实现专业级抖动效果,提升游戏沉浸感。

weixin_30300225的博客 97

Redis分布式锁演进架构

【一】引言 分布式锁相信大家一定不会陌生,想要用好或者自己写一个却没那么简单。 想要达到上述的条件,一定要 掌握分布式锁的应用场景,以及分布式锁的不同实现,不同实现之间有什么区别。 【二】分布式锁场景 如果想真正了解分布式锁,需要结合一定场景; 举个例子,某夕夕上抢购 AirPods Pro 的 100 元优惠券。 如果使用下面这段代码当作抢购优惠券的后台程序,我们一起看一下,可能存...

Chimengmeng的博客 174

Flotherm XT学习历程

大家好,通过半年的热仿真软件学习使用,最终发现最好用,最好上手的软件就是Flotherm XT,对新手非常友好,但由于软件近几年才发布,网上教程非常少,后面我将在这里持续分析软件使用心得,和大家一起学习。

xiaoredred的博客 6264

Redis实现分布式锁的基本原理与问题演进

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

m0_49692893的博客 381

三相SVPWM逆变器双闭环PI解耦控制:从dq坐标系到参数整定实战

本文深入解析了三相SVPWM逆变器的双闭环PI解耦控制技术。通过引入dq坐标系,将交流量转换为直流量,并结合前馈补偿实现电流环的解耦控制。文章详细阐述了从数学模型推导、控制器设计到参数整定与SVPWM实现的完整流程,为工程师提供了从理论到实战的系统性指导。

weixin_28292761的博客 405

YOLOv8改进 - 注意力篇 - 引入CAA注意力机制

YOLOv8改进 - 注意力篇 - 引入CAA注意力机制

浪子L的博客 5223

分布式锁原理

一、分布式锁基本原理 比如,我们现在有这么多商品服务,现在都要查数据库,现在我们约定只有一个人能查数据库,查完以后放到缓存里面。 这样呢,所有服务都要进来,需要抢占一个锁,本地情况下,我们可以使用语法比如synchronize(this)锁住当前对象,只要大家用的是一个对象,就能锁住了。 在分布式情况下也一样,我们this在分布式情况下,肯定没得用。 但是,我们可以考虑现实生活中的一个例子,比如,我们几千个人都去上公共厕所,里面只有一个坑位,那如何保证他们有序的进行,就是说,只要我进来了,我就给

Jak的博客 3650

Python时间序列:PaddleTS-时间序列分类

评估的指标采用F1,Precision,Recall,PaddleTS已经基于TSDataset实现了这三个指标的计算,直接调用即可。使用内置的API:get_dataset加载BasicMotions数据集。模型训练完成之后,可以对测试集进行预测并评估。模型保存之后,可以加载模型用于新的数据预测。可以将训练完成的模型保存到指定路径。概率预测 可以返回每个分类的概率。安装paddlets。

斌擎科技 1293

Redis

目录前言1. 概述1.1 互联网架构的演变历程1.2 Redis入门介绍1.3 Redis/Memcache/MongoDB对比1.3.1 Redis和Memcache1.3.2 Redis和MongoDB1.4 分布式数据库CAP原理1.4.1 CAP简介1.4.2 CAP理论1.4.3 CAP总结2. 下载与安装2.1 下载2.2 安装2.3 安装后的操作2.3.1 后台运行方式2.3.2 关闭数据库2.3.3 常用操作2.3.4 连接redis并测试2.3.5 HelloWorld2.3.6 测试性能

m0_46337171的博客 999

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

使用 Redis 实现分布式锁的基本思路

在分布式系统中,多个进程或服务可能会同时访问共享资源(如数据库、缓存、文件等),这可能会导致**数据不一致**或**并发冲突**。Redis 由于其**高性能**和**单线程模型**,是实现分布式锁的一个常见选择。本文将详细介绍使用 Redis 实现分布式锁的基本思路,包括 **实现方式**、**锁的释放**、**可能存在的问题** 以及 **优化方案**。

maply的博客 1280

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

redis 分布式锁实现

分布式锁

weixin_44550507的博客 2059

Redis-分布式锁

帮助你快速理解和学习redis的分布式锁实现逻辑。

2302_77423520的博客 4443

基于Redis实现的分布式锁

利用set nx ex获取锁,并设置过期时间,保存线程标示释放锁时先判断线程标示是否与自己一致,一致则删除锁特性:利用set nx满足互斥性利用set ex保证故障时锁依然能释放,避免死锁,提高安全性利用Redis集群保证高可用和高并发特性。

Achooyo的博客 2323

Redis分布式锁的实现核心思路

Redis分布式锁的实现核心思路

m0_61787196的博客 964

Redis实现分布式锁详解

分布式锁满足分布式系统或集群模式下多进程可见并且互斥的锁。分布式锁的核心思想就是让大家都使用同一把锁,只要大家使用的是同一把锁,那么我们就能锁住线程,不让线程进行,让程序串行执行,这就是分布式锁的核心思路可见性:多个线程都能看到相同的结果,注意:这个地方说的可见性并不是并发编程中指的内存可见 性,只是说多个进程之间都能感知到变化的意思互斥:互斥是分布式锁的最基本的条件,使得程序串行执行高可用:程序不易崩溃,时时刻刻都保证较高的可用性高性能。

weixin_43811057的博客 4587

【Redis分布式锁】高并发场景下秒杀业务的实现思路(集群模式)

我们在上篇文章中实现了单机模式下的秒杀业务。其中采用了synchronized加锁来解决各种线程安全问题。而synchronized关键字是依赖于单机的JVM,在集群模式下,每个服务器都有独立的JVM,如果此时还采用synchronized关键字加锁,就会导致不同服务器间出现线程安全问题。如果有什么讲的不对的地方欢迎在评论区指出,希望能够和你们一起进步✊。

acm_pn的博客 1511

什么是分布式锁?Redis的分布式锁又是什么?

分布式锁是一种用于解决分布式系统中多节点对共享资源并发访问问题的机制。在分布式系统中,多个服务器实例或服务进程可能同时操作某个共享资源(如数据库记录、缓存条目、文件等),导致数据不一致或竞争条件。分布式锁可以确保同一时刻只有一个节点可以访问或修改该资源,避免并发问题。

Stringzhua的博客 2454

Redis 三 Redis分布式锁

* 极端情况** 线程1现在持有锁之后,在执行业务逻辑过程中,他正准备删除锁,而且已经走到了条件判断的过程中,比如他已经拿到了当前这把锁确实是属于他自己的,正准备删除锁,但是此时他的锁到期了,那么此时线程2进来,但是线程1他会接着往后执行,当他卡顿结束后,他直接就会执行删除锁那行代码,相当于条件判断并没有起到作用,这就是删锁时的原子性问题,之所以有这个问题,是因为线程1的拿锁,比锁,删锁,实际上并不是原子性的,我们要防止刚才的情况发生,乐观锁适合更新数据,而插入数据适合使用悲观锁。

George_huhu的博客 1528
上一篇: ThreadLocal内存泄漏问题和解决方法
下一篇: Gitlab基于k8s简单部署
oDeviloo
博客等级 码龄12年 115粉丝 92原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值