【Redis】Redis分布式锁

引入

首先看下面这段代码:
在这里插入图片描述

这是一段抢券代码,看着没什么问题,但是当是多线程情况下,那么就可能出现并发问题,出现超卖。为了解决这个问题,我们可能会加锁,那么接下来看加锁后的代码:

在这里插入图片描述

这段代码已经完美解决了超卖的问题,但是我们要想,如果我们的项目是单体项目,且只启动了一台服务,那么上面加锁后的代码是没问题的。但我们的项目往往是集群部署,把同一份代码部署再多台服务器上。如下图所示:

在这里插入图片描述
如果是这样的话,那么我们加锁的逻辑就又出现问题了。看下面逻辑:

在这里插入图片描述

左边是 8080 服务线程,右边是 8081 服务线程。8080 服务线程 1 可以拿到互斥锁,查询到优惠券,而右边 8081 服务线程 1 也拿到互斥锁,查询了优惠券,这时我们发现各个服务都能查询到优惠券,这就出现了问题。
那这是为什么呢?这是因为Sychronized属于本地锁,目前锁是属于 JVM 的,然而每一个服务都有自己的 JVM。Sychronized只能解决同一个 JVM 线程下的互斥,而不能解决多个 JVM 下线程的互斥。所以我们需要使用一个外部的锁,那么这就是分布式锁

在这里插入图片描述

Redis 实现分布式锁

Redis 实现分布式锁是基于 Redis 的 setnx 命令来实现的。
在这里插入图片描述

设置超时时间是为了防止某台服务宕机,能够自动释放锁。
如何合理控制锁的有效时长?换句话说,如果执行业务的时长大于了锁的时间,那么该怎么办呢?我们就需要给锁续期。我们可以新开一个线程监控,然后进而监听、续期。现在市面上有很多成熟的技术,那么 redisson 就是其中一种。

Redisson 实现分布式锁-执行流程

Redisson 实现分布式锁也是基于 Redis 的 setnx 命令来实现的,只不过 Redisson 又做了很多的增强和优化。
看下面流程:

在这里插入图片描述
加锁成功以后,会另开一个线程进行监控这个持有锁的线程,然后续期。releaseTime 就是锁的过期时间,默认是 30 秒。释放锁需要我们手动来释放,然后通知看门狗无需监听。
Redisson 中还新增了重试机制
当一个线程来了之后,不能获取到锁,会进行不断地循环获取锁。流程如下:

在这里插入图片描述
所有 redis 命令基于 lua 脚本完成的,保证原子性。
redisson 使用:

在这里插入图片描述

Redisson 实现分布式锁-可重入

待补充~~~

Redisson 实现分布式锁-主从一致性

RedLock 红锁可以保证主从一致性,但是实现复杂,性能差,较麻烦,所以不推荐使用。

在这里插入图片描述

面试常问

在这里插入图片描述

参考链接

https://www.bilibili.com/video/BV1yT411H7YK?p=14
https://www.bilibili.com/video/BV1yT411H7YK?p=15

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

推荐5款大佬都在用的开源项目!PDF处理、AI换脸、声音克隆等!

GitHub圈选 项目推荐: Stirling-PDF(PDF处理工具) Rope(AI换脸工具) clone-voice(声音克隆工具) N_m3u8DL-RE(流媒体下载器) toBeBetterJavaer(Java学习指…

自动化测试框架—数据驱动

什么是数据驱动? 数据驱动是主流的自动化测试设计模式,测试数据和测试代码分离,测试数据存储在外部文件中,如 excel、json、yaml等文件,也可以存在数据库中。同一个测试方法,可以多个自动化测试 case。 数…

【PDF密码】PDF文件为什么无法修改?为什么PDF文档不支持编辑?

pdf文件大家应该都经常接触,但是不知道大家会遇到这种情况:有些PDF文件打开之后无法编辑?是什么原因呢?今天我们来分析一下都是那些原因导致的。 首先我们可以考虑一下,PDF文件中的内容是否是图片,如果确认…

螺纹钢负公差轧制中的测径仪应用

1、负公差轧制意义 为了满足生产使用要求,并根据轧制水平,在产品标准冲规定钢材尺寸的波动范围,允许钢材的实际尺寸与公称尺之间有一定的偏差,这个偏差一般称公差,公差分正、负公差,钢材按负公差轧制时&…

untiy使用http下载资源

文章目录 提醒下载一个资源并保存到本地下载一张图片 提醒 部分API需要将Unity的 Edit/PrejectSetting/Player/OtherSetttings/AConfiguration/ApiCompatibilityLevel 设为.NetFramework 才可以使用 下载一个资源并保存到本地 private IEnumerator DownloadFormServer_IE(st…

python爬虫实战(7)--获取it某家热榜

1. 需要的类库 import requests from bs4 import BeautifulSoup import pandas as pd2. 请求榜单 def fetch_ranking_data():url "https://m.xxx.com/rankm/" #某家response requests.get(url)if response.status_code 200:return response.contentelse:print(f…

解决python画图无法显示中文的问题

python画图遇到的问题: 中文不显示: 解决方法:把字体设置为支持中文的字体,比如黑体 黑体下载链接: 链接:https://pan.baidu.com/s/1BD7zQEBUfcIs6mC2CPYy6A?pwdv120 提取码:v120 pyhon…

“双碳”目标下绿色节能数据中心的节能降耗之路

随着数字经济的发展和国家东数西算工程的推进,数据中心行业也在快速发展。数字时代,算力是重要支撑,数据中心作为算力网络的底座为数字经济的发展起到支撑的作用,同时作为能耗最多的行业之一,在国家“双碳”战略下,如何…

国产服务器 BIOS下组建RADI不同RAID卡-超详细

国产服务器 长城 组建Raid的方法 说明 大多数国产服务器通用型服务器进入BIOS的都是按DEL键。 9361RAID卡组建方法 在服务器启动过程中,按下DEL键进入BIOS界面。 进入设备管理器,选择AVAGO MegaRAID页签。 3. 进入RAID卡设备,选择Main Me…

【数字人】9、DiffTalk | 使用扩散模型基于 audio-driven+对应人物视频 合成说话头(CVPR2023)

论文:DiffTalk: Crafting Diffusion Models for Generalized Audio-Driven Portraits Animation 代码:https://sstzal.github.io/DiffTalk/ 出处:CVPR2023 特点:需要音频对应人物的视频来合成新的说话头视频,嘴部抖…

Mysql——索引相关的数据结构

索引 引入 我们知道,数据库查询是数据库的最主要功能之一。我们都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化。最基本的查询算法当然是顺序查找(linear search),这种复杂度为…

缓存代理服务器

1 缓存代理 1.1 缓存代理的概述 web代理的作用 缓存网页对象,减少重复请求 存储一些之前被访问的或且可能将要备再次访问的静态网页资源对象,使用户可以直接从缓存代理服务器获取资源,从而减少上游原始服务器的负载压力,加快整…

android自定义时间选择

自定义时间选择器,可以更改到年月日,时分秒 一、自定义DatePicker public class CustomDatePicker {/*** 定义结果回调接口*/public interface ResultHandler {void handle(String time);}public enum SCROLL_TYPE {HOUR(1),MINUTE(2);SCROLL_TYPE(int …

【动态规划】【 数学】C++算法:514自由之路

作者推荐 【动态规划】458:可怜的小猪 涉及知识点 动态规划 数学 力扣514 自由之路 电子游戏“辐射4”中,任务 “通向自由” 要求玩家到达名为 “Freedom Trail Ring” 的金属表盘,并使用表盘拼写特定关键词才能开门。 给定一个字符串 ring &#x…

PyCharm安装使用教程2024

简介 PyCharm是一种PythonIDE(Integrated Development Environment,集成开发环境),带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试、语法高亮、项目管理、代码跳转、智能提示、自动完成、单…

【C++期末】酒店住宿信息管理系统(含easyX)

诚接计算机专业编程作业(C语言、C、Python、Java、HTML、JavaScript、Vue等),如有需要请私信我,或者加我的企鹅号:1404293476 本文资源:https://download.csdn.net/download/weixin_47040861/88725363 目录 1.题目要求 2.实现效…

Spring Security介绍

一、Spring Security: 1、简介:Spring Security 是一个非常流行和成功的 Java 应用开发框架。Spring Security 基于 Spring 框架,提供了一套 Web 应用安全性的完整解决方案。一般来说,Web 应用的安全性包括用户认证(A…

从吸引外资连续三年高增长看中国IT云计算科技行业的发展

​引言:开放合作共发展,砥砺前行迎未来 【科技明说 | 科技热点关注】 我今天刚注意到商务部公布的最新数据,2019年至2021年,中国吸引外资实现连续三年高增长。 2022年前11个月实际使用外资金额11560.9亿元,为历史同期…

【开源】基于JAVA的民宿预定管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用例设计2.2 功能设计2.2.1 租客角色2.2.2 房主角色2.2.3 系统管理员角色 三、系统展示四、核心代码4.1 查询民宿4.2 新增民宿4.3 新增民宿评价4.4 查询留言4.5 新增民宿订单 五、免责说明 一、摘要 1.1 项目介绍 基于…

C#编程-实现线程声明周期

实现线程声明周期 当System.Threading.Thread类的对象被创建的时候,线程的生命周期开始。线程的生命周期在完成任务时结束。在线程的生命周期中有各种状态。这些状态是: 未启动状态可运行状态不可运行状态死亡状态下图显示了线程的各种状态和引起线程从一个状态变为另一个状…