分布式锁专题-分布式锁入门

【Redis】分布式锁之 Redission 本文主要介绍了基于setnx实现的分布式锁存在的问题,包括重入问题、不可重试、超时释放和主从一致性问题。接着介绍了 Redission 的快速入门方法,包括引入依赖、配置客户端和使用分布式锁。然后详细阐述了 Redission 可重入锁原理、锁重试和 WatchDog 机制以及锁的 MutiLock 原理,为读者深入理解 Redission 分布式锁提供了全面的参考。 阅读详情

1.引入业务场景

业务场景一

因为小T刚接手项目,正在吭哧吭哧对熟悉着代码、部署架构。在看代码过程中发现,下单这块代码可能会出现问题,这可是分布式部署的,如果多个用户同时购买同一个商品,就可能导致商品出现 库存超卖 (数据不一致) 现象,对于这种情况代码中并没有做任何控制。

原来一问才知道,以前他们都是售卖的虚拟商品,没啥库存一说,所以当时没有考虑那么多…

这次不一样啊,这次是售卖的实体商品,那就有库存这么一说了,起码要保证不能超过库存设定的数量吧。

小T大眼对着屏幕,屏住呼吸,还好提前发现了这个问题,赶紧想办法修复,不赚钱还赔钱,老板不得疯了,还想不想干了~

业务场景二

小T下面的一位兄弟正在压测,发现个小问题,因为在终端设备上跟鹅厂有紧密合作,调用他们的接口时需要获取到access_token,但是这个access_token过期时间是2小时,过期后需要重新获取。

压测时发现当到达过期时间时,日志看刷出来好几个不一样的access_token,因为这个服务也是分布式部署的,多个节点同时发起了第三方接口请求导致。

虽然以最后一次获取的access_token为准,也没什么不良副作用,但是会导致多次不必要的对第三方接口的调用,也会短时间内造成access_token的 重复无效获取(重复工作)。

以上便于大家理解为什么要用分布式锁才能解决,勾勒出的几个业务场景。上面的问题无一例外,都是针对共享资源要求串行化处理,才能保证安全且合理的操作。

用一张图来体验一下:
在这里插入图片描述
此时,使用Java提供的Synchronized、ReentrantLock、ReentrantReadWriteLock…,仅能在单个JVM进程内对多线程对共享资源保证线程安全,在分布式系统环境下统统都不好使,心情是不是拔凉呀。这个问题得请教 分布式锁 家族来支持一下,听说他们家族内有很多成员,每个成员都有这个分布式锁功能,接下来就开始探索一下。

2.分布式锁概述

2.1.为什么需要分布式锁才能解决?

听听 Martin 大佬们给出的说法,请你自己看 Maritin 博客文章:

https://martin.kleppmann.com/2016/02/08/how-to-do-distributed-locking.html

Martin kleppmann 是英国剑桥大学的分布式系统的研究员,曾经跟 Redis 之父 Antirez 进行过关于 RedLock (Redis里分布式锁的实现算法)是否安全的激烈讨论。

2.2.分布式锁考虑的问题

效率:
使用分布式锁可以避免多个客户端重复相同的工作,这些工作会浪费资源。

比如业务场景二,重复获取access_token。

对共享资源的操作是幂等性操作,无论你操作多少次都不会出现不同结果。
本质上就是为了避免对共享资源重复操作,从而提高效率。

正确性:

使用分布式锁同样可以避免锁失效的发生,一旦发生会引起正确性的破坏,可能会导致数据不一致,数据缺失或者其他严重的问题。
2.3.分布式锁特点

以下是分布式锁的一些特点,分布式锁家族成员并不一定都满足这个要求,实现机制不大一样。

互斥性: 分布式锁要保证在多个客户端之间的互斥。
可重入性:同一客户端的相同线程,允许重复多次加锁。
锁超时:和本地锁一样支持锁超时,防止死锁。
非阻塞: 能与 ReentrantLock 一样支持 trylock() 非阻塞方式获得锁。
支持公平锁和非公平锁:公平锁是指按照请求加锁的顺序获得锁,非公平锁真好相反请求加锁是无序的。

3.分布式锁家族实现者介绍

分布式锁家族实现者一览:

在这里插入图片描述
下面让他们分别来做下自我介绍:

3.1.数据库实现

排它锁(悲观锁):

基于 select * from table where xx=yy for update SQL语句来实现,有很多缺陷,一般不推荐使用。

乐观锁:

表中添加一个时间戳或者版本号的字段来实现,update xx set version = new... where id = y and version = old 当更新不成功,客户端重试,重新读取最新的版本号或时间戳,再次尝试更新,类似 CAS 机制,推荐使用。
3.2.Redis实现

特点:CAP模型属于AP | 无一致性算法 | 性能好

开发常用,如果你的项目中正好使用了redis,不想引入额外的分布式锁组件,推荐使用。

业界也提供了多个现成好用的框架予以支持分布式锁,比如Redisson、spring-integration-redis、redis自带的setnx命令,推荐直接使用。

另外,可基于redis命令和redis lua支持的原子特性,自行实现分布式锁。
3.3.Zookeeper

特点:CAP模型属于CP | ZAB一致性算法实现 | 稳定性好

开发常用,如果你的项目中正好使用了zk集群,推荐使用。

业界有Apache Curator框架提供了现成的分布式锁功能,现成的,推荐直接使用。

另外,可基于Zookeeper自身的特性和原生Zookeeper API自行实现分布式锁。
3.4.其他
Chubby,Google开发的粗粒度分布锁的服务,但是并没有开源,开放出了论文和一些相关文档可以进一步了解,出门百度一下获取文档。

Tair,是阿里开源的一个分布式KV存储方案。

Etcd,CAP模型中属于CP,Raft一致性算法实现。

Hazelcast,是基于内存的数据网格开源项目,提供弹性可扩展的分布式内存计算,并且被公认是提高应用程序性能和扩展性最好的方案,听上去很牛逼。

当然了,上面推荐的常用分布式锁Zookeeper和Redis,使用时还需要根据具体的业务场景,做下权衡,实现功能上都能达到你要的效果,原理上有很大的不同。

基础篇:分布式锁的入门学习 分布式锁是什么?有什么用? 分布式锁的核心必备东西有哪些? 分布式锁的应用场景有哪些? Redisson入门使用 阅读详情

相关推荐

分布式锁-快速入门

由于在平时的工作中,线上服务器是分布式多台部署的,经常会面临解决分布式场景下数据一致性的问题,那么就要利用分布式锁来解决这些问题。分布式的CAP理论告诉我们“任何一个分布式系统都无法同时满足一致性、可用性和分区容错性,最多只能同时满足两项”,故此很多系统在设计之初就要对这三者做出取舍。在互联网领域的绝大多数的场景中,都需要牺牲强一致性来换取系统的高可用性,系统往往只需要保证“最终一致性”,只要这个最终时间是在用户可以接受的范围内即可。

独泪了无痕 818

分布式系统 - 分布式锁及实现方案

要介绍分布式锁,首先要提到与分布式锁相对应的是线程锁、进程锁。线程锁:主要用来给方法、代码块加锁。当某个方法或代码使用锁,在同一时刻仅有一个线程执行该方法或该代码段。线程锁只在同一JVM中有效果,因为线程锁的实现在根本上是依靠线程之间共享内存实现的,比如synchronized是共享对象头,显示锁Lock是共享某个变量(state)。进程锁:为了控制同一操作系统中多个进程访问某个共享资源,因为进程具有独立性,各个进程无法访问其他进程的资源,因此无法通过synchronized等线程锁实现进程锁。分布式锁。

明平姚的博客 448

CentOS7.9 安装 ImageMagick,图片转换为HEIC图像格式

由于ImageMagick7以下不支持heic等图片格式,所以重新安装了ImageMagick7.1版本支持heic格式,在网上找了很多资料,归纳总结并写此文章记录一下。在Linux(CentOS7.9)上安装ImageMagick7.1.1-38。

shmily_i的博客 1941

分布式锁解决方案总结

基于redis、zookeeper的分布式锁原理及实现

qq_33594592的博客 1739

VS2019 C# MySQL 学生信息增删改查(一、增删)

VS2019 C# MySQL 学生信息增删改查 由于刚刚学习VS2019,入手的第一个例子是编写一个简单的增删改查。这里,我以学生信息为例,进行详细的过程描述以及代码实现。 一、 新建一个Windows窗体应用程序 1、创建新项目界面,如下图所示。 2、更改项目名称,当然不修改也可以。我这里的是“StudentInfoSystem”;项目存放位置路径根据自己需要进行更改;“将解决方案和项目放在同一目录中”前面的勾选框,选不选都可以;点击“创建”,如下图所示。 二、前期准备工作 1、将Form1属性中

青哥 1万+

Robocup 仿真2D 学习笔记(二) 球队代码编译和上场

环境的一些问题 最近在使用rcssserver 和 rcssmonitor时可能会遇到./configure失败的问题,可以检查一下文件夹是否有makefile文件,如果是编译后的包直接sudo make install,如果还不行,还可以源码下载编译 rcssserver: https://sourceforge.net/projects/sserver/files/rcssserver/...

markchalse的博客 6015

必须掌握【分布式锁】三种实现方式

点击上方↑↑↑“Java后端技术栈”关注我们一、为什么要使用分布式锁我们在开发应用的时候,如果需要对某一个共享变量进行多线程同步访问的时候,可以使用我们学到的Java多线程的18般武艺进...

田维常 1379

用Multisim和AD2复刻经典:手把手教你搭建μA741三角波-方波发生器(附完整避坑指南)

本文详细介绍了如何使用Multisim和AD2搭建基于μA741运算放大器的三角波-方波发生器,包括电路原理、Multisim仿真流程、AD2硬件搭建及调试技巧。通过对比理论计算、仿真和实测数据,深入分析器件非理想特性的影响,并提供16个典型问题的解决方案,帮助读者掌握波形发生器的设计原理和工程调试经验。

weixin_28744423的博客 285

一.锁和分布式锁的小认知

后续待补充

筑基修士@韩跑跑 335

Crazyflie 2.1固件刷写与地址配置全攻略:从开箱到连接Crazyswarm

本文详细介绍了Crazyflie 2.1微型无人机的固件刷写、地址配置及与Crazyswarm系统的集成方法。从开箱检查到多机协同飞行,涵盖了硬件准备、固件刷写、无线电地址修改等关键步骤,帮助用户快速实现集群飞行控制。特别针对Crazyswarm系统集成提供了实用配置示例和调试技巧。

weixin_42530458的博客 405

LLM评测框架Ragas:测试RAG的性能出现TimeoutError()的解决办法(Ragas+langchain+ollama)

无奈之下,自己找到了一个解决办法,在ragas支持的llm类库中加了一个如下的类,支持ollama、langchian_ollama使用ragas测试报错的问题。可以将如上的库放到你的ragas的系统库的llms目录下,然后修改__init__.py如下。最近用ragas测试rag的性能,发现老出现TimeoutError()的错误。这是一个临时的解决办法,具体等待官方给出最终的解决方案。后来发现官方也没有尽快支持的计划。然后就可以用如下代码进行一些验证。

Criss@陈磊 666

Redis分布式锁8大细节

https://mp.weixin.qq.com/s/8NFqfsQ8KAIhXE_6o9MiOQ

专业的计算机毕业设计指南 1116

第十届MathorCup高校数学建模挑战赛-B题:养老服务床位需求预测与运营模式研究

当养老床位数增加时存在的商机,提出了相应的养老服务床位的运营商业模式。就业的可能性,建立多目标规划模型,尽可能同时满足三方面的要求。务床位的需求、制定合理的养老服务床位发展规划,是构建和谐社会、幸福社会。问题一的床位需求与市场类型的分类结果,查找关于国内养老院的相关数据,探。求,又能持续发展养老事业,同时还能促进社会就业的养老服务床位运营的商业。养老服务床位数的增加能够带来的就业方面因素的影响,并对这些因素进行一个。你们的模型及其结论为科学依据,对政府管理部门针对养老床位规划提出合理的。

getusushu的博客 1140

专题四 Redis分布式锁中——Redission

Redis分布式锁

新入坑的嵌入式的小白 1万+

【100%通过率】2023华为od机试C卷【电脑病毒感染】C语言 实现

一个局域网内有很多台电脑,分别标注为 0 ~ N-1 的数字。相连接的电脑距离不一样,所以感染时间不一样,感染时间用t 表示。其中网络内一台电脑被病毒感染,求其感染网络内所有的电脑最少需要多长时间。如果最后有电脑不会感染,则返回-1.

MISAYAONE的博客 1044

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【面试】分布式锁专题

分布式锁是一种在分布式系统环境下实现的锁机制,它主要用于解决,多个分布式节点之间对共享资源的互斥访问问题,确保在分布式系统中,即使存在有多个不同节点上的进程或线程,同一时刻也只有一个节点可以获得锁并对共享资源进行操作,从而维护数据的一致性和完整性。分布式锁的特点互斥性:同一时间只能一个节点获取到锁,其他节点需要等待获取到锁的节点释放了锁才可以获取到锁,而这里的等待一般是通过阻塞,和自旋两种方式安全性:解铃还须系铃人,只能释放自己的锁不能误删别人的锁。

现在的我强的可怕 1202

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

redis实战-redis实现分布式锁&redisson快速入门

redis做分布式锁的实战文章

weixin_64133130的博客 3000

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Redis实战——Redisson分布式锁

Redis实战——Redisson分布式锁的使用及原其理

qq_59212867的博客 7498

【Redis从入门到进阶】第 7 讲:基于 Redis 实现分布式锁

【Redis从入门到进阶】第 7 讲:基于 Redis 实现分布式锁

执梗的博客 4309

【PmHub面试篇】PmHub集成Redission分布式锁保障流程状态更新面试专题解析

本文聚焦PmHub整合分布式锁技术的面试题预测,重点围绕Redis分布式锁展开。内容包括:分布式锁的概念与作用;Redis通过`SET key value NX PX timeout`命令实现锁的原理;通过记录线程信息处理可重入性问题;以设置过期时间和watchdog机制保障锁释放;利用Lua脚本和Redisson库优化性能。同时对比了Redis与Zookeeper实现分布式锁的差异,前者基于键值对、适合简单场景,后者通过临时节点实现、一致性更高,适用于高可靠需求场景,文末附相关参考链接。

专注Java和MySQL领域知识分享 1150

Redis分布式锁入门

线程锁:主要用来给方法、代码块加锁。当某个方法或代码使用锁,在同一时刻仅有一个线程执行该方法或该代码段。线程锁只在同一JVM中有效果,因为线程锁的实现在根本上是依靠线程之间共享内存实现的,比如synchronized是共享对象头,显示锁Lock是共享某个变量(state)进程锁:为了控制同一操作系统中多个进程访问某个共享资源,因为进程具有独立性,各个进程无法访问其他进程的资源,因此无法通过synchronized等线程锁实现进程锁。分布式锁:当多个进程不在同一个系统中,用分布式锁控制多个进程对资源的访问。这

qq_45191024的博客 1121

Redis的分布式锁分析

开发同学都知道,在分布式系统中,为了保证多个机器并发操作的数据一致性,常常需要使用分布式锁机制。常用的比如数据库锁,ZK锁,Reis锁等等,今天我们就探讨下Redis分布式锁,说说他的实现原理和应用场景,并介绍如何正确使用分布式锁来解决并发问题

战斧的博客 7312

Redis-分布式锁

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

2302_77423520的博客 4444

分布式锁

现在面试都会聊聊分布式系统,通常面试官都会从服务框架(Spring Cloud、Dubbo),一路聊到分布式事务、分布式锁、ZooKeeper等知识。今天就来聊聊分布式锁这块的知识,先具体的来看看Redis分布式锁的实现原理。 如果在公司里落地生产环境用分布式锁的时候,一定是会用开源类库的,比如Redis分布式锁,一般就是用Redisson框架就好了,非常的简便易用。感兴趣可以去Redisson官网看看如何在项目中引入Redisson的依赖,然后基于Redis实现分布式锁的加锁与释放锁。 一段简单的使用

曾子墨 1万+

分布式锁面试专题

1 分布式锁 2 强推: 怎样实现redis分布式锁?与大多数工具一样,分布式锁的选择需要根据业务场景确定。 比如在注重性能的场景,比如使用分布式锁 直接使用单机版但是能保证主从复制性质的redission分布式锁,是一种比较好的选择。 但是在注重安全的场景下,需要保证数据的强一致性,就肯定不能使用redission(下面提到了),而应该选用基于raft,paxos等强一致性算法的etcd,zookeeper分布式锁。使用Redisson单机主从复制版的分布式锁的场景:订单系统:在电商平台的订单系统中,当用

yxg520s的博客 444

分布式锁专题

在上一版本中,如果本线程处理时间超过了为锁添加的时间,锁会自动消失,此时其他线程会以同样的key创建锁,若本线程刚好业务完成,因为自己的锁已经过期消失,而其他线程创建的锁与本线程创建的锁key相同,本线程会误以为是自己的锁将其释放,就会产生误删。版本四:为锁添加过期时间,在微服务集群的下,在服务成功加锁之后,主机节点突然宕机,没机会释放锁,就会导致死锁, 这里就需要给锁加一个过期时间,当服务主机宕机后,可以自行释放锁,来确保其他区服务节点正在运行。然后锁超时了,别的线程又获取到了锁,又出现了误删的问题。

m0_64662849的博客 798
上一篇: Quartz定时任务入门
下一篇: 分布式锁专题-Jedis实现分布式锁
熊猫IT技术
熊猫IT技术 优质创作者: Java技术领域 优质创作者: Java技术领域 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄10年 6021粉丝 1312原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熊猫IT技术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值