【Java面试】三、Redis篇(下)

文章目录

  • 1、抢券场景
  • 2、Redis分布式锁
  • 3、Redisson实现分布式锁
  • 4、Redisson实现的分布式锁是可重入锁
  • 5、Redisson实现分布式锁下的主从一致性
  • 6、面试

1、抢券场景

正常思路:
在这里插入图片描述

代码实现:
在这里插入图片描述

比如优惠券数量为1。正常情况下:用户A的请求过来(对应线程1),查库存,抢券、改库存,然后用户B也来请求(对应线程2),继续查库存,抢券,此时,库存为0,抢券失败,没问题。

在这里插入图片描述

但既然是抢券,就不会一个请求一个请求的来,并发下,线程必然交替执行。

在这里插入图片描述

线程1查完库存,num=1,挂起,同时线程2执行,查库存,num=1,此时,线程2被挂起,线程1抢完券,改库存减一,库存为0。线程2继续执行,其挂起前查的num为1,也去扣减库存,此时,就会超卖。先考虑加锁,因为是并发抢夺同一个资源:

在这里插入图片描述
时序图:

在这里插入图片描述
如此,就解决了问题。但生产环境,一般不是单节点部署,如果抢券接口所在的微服务被部署在了三个节点或者实例上,这三个实例对应三个JVM

在这里插入图片描述

此时,线程1、2的请求被路由到8080的实例,线程3、4的请求被路由到8081的实例,则线程1和线程3都能获取到互斥锁。因为:代码里获取的synchronize锁属于本地锁,这个锁是属于JVM里的,现在一份代码跑在多个实例中,每个实例都启动了一个JVM。也就是说,synchronize能解决通一个JVM下的互斥,但解决不了多个JVM下的互斥,所以,集群下,不能使用本地锁来实现了,要用一个外部的锁

在这里插入图片描述

由此,引入分布式锁(超出JVM之外的外部锁):

在这里插入图片描述

2、Redis分布式锁

Redis实现分布式锁,依靠setnx命令,setnx即set if not exists,不存在就set:

//获取锁,NX是互斥,EX是设置超时时间
SET lock value NX EX 10
//释放锁,删除即可
DEL key

通过set来获取锁时,之所以设置过期时间,倒不是担心发生异常,导致锁释放失败,这个可以try-finally,如果不是异常,而是获取锁后服务器宕机,则这个锁永远不会被释放。

在这里插入图片描述

但这个超时时间如何控制,根据业务时间估算是不靠谱的,考虑开个线程:如果业务还在执行的话,就去给锁续期 ⇒ 关于这个思想的落地:redission

3、Redisson实现分布式锁

和单纯的setnx相比,Redisson除了加锁,还会单开一个线程(看门狗)去给锁续期,没releaseTime/3做一次续期,releaseTime即锁的超时时间,默认30秒。即watch dog线程每10秒给持有分布式锁的线程做一次续期,将其重置为默认的30秒。最后线程释放分布式锁的时候,通知对应的watch dog线程,不用再做监听了。

在这里插入图片描述

此外,线程A持有分布式锁的时候,线程B再来尝试获取锁,如果获取失败,会while循环尝试加锁,循环次数达到阈值后,还没获取成功,则返回获取锁失败。

在这里插入图片描述
代码实现:

<dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.16.3</version> <!-- 替换需要的版本号 -->
</dependency>
@Resource
private RedissonClient redissonClient;public void redissonLock() {//获取锁(重入锁)RLock lock = redissonClient.getLock("your-key");try {//tryLock方法重载,形参1为获取锁的最大等待时间,形参2为锁超时释放时间,形参3为时间单位boolean isLock = lock.tryLock(10, TimeUnit.SECONDS);//注意下面,如果传了锁超时释放时间,则watch dog机制失效,redisson认为你自己可以控制超时时间,不传或传-1,则有看门狗续期//boolean isLock = lock.tryLock(10, 30, TimeUnit.SECONDS);//获取锁成功if (isLock) {System.out.println("执行业务");}} catch (InterruptedException e) {//打印必要的loge.printStackTrace();} finally {//释放锁lock.unlock();}
}

最后,以上加锁、设置过期时间灯操作是基于Lua脚本完成,原子性有保证

4、Redisson实现的分布式锁是可重入锁

redisson实现的分布式锁是可重入锁:

public void add1(){RLock lock = redissonClient.getLock("your-key");boolean isLock = lock.tryLock();//执行业务add2();//释放锁lock.unlock();
}public void add2(){RLock lock = redissonClient.getLock("your-key");boolean isLock = lock.tryLock();//执行业务//释放锁lock.unlock();
}

判断是同一个线程ID,就可重入,内部用hash结构记录线程ID和可重入的次数

在这里插入图片描述

5、Redisson实现分布式锁下的主从一致性

Java应用尝试获取分布式锁(Set lock xx)到master节点,线程获取锁成功,正常接下来应该主从同步。

在这里插入图片描述

若此时master宕机,没来得及同步到slave,然后主从故障转移,从slave中选出一个新的master,线程2又来获取锁,此时,对新的master,自然可以set成功,即获取分布式锁成功,如此,就出现了两个线程同时获取到了分布式锁。

在这里插入图片描述

针对这个问题,刚第一反应是等同步到slave了再返回写入成功,即抢锁成功,但这样也性能太差了,没意义了。 ⇒ 红锁方案:红锁即ReadLock,指不能只在一个redis实例上创建锁,应该在(n/2+1)个节点上创建锁成功(n为Redis节点的数量),但这样Redis集群运维难度大、性能差,也有局限性,不推荐。

在这里插入图片描述
最后,Redis集群优先是AP,即高可用,如果需要数据的强一致性,那可使用zookeeper来实现分布式锁

6、面试

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

DeepRec Extension 打造稳定高效的分布式训练

DeepRec Extension 即 DeepRec 扩展&#xff0c;在 DeepRec 训练推理框架之上&#xff0c;围绕大规模稀疏模型分布式训练&#xff0c;我们从训练任务的视角提出了自动弹性训练&#xff0c;分布式容错等功能&#xff0c;进一步提升稀疏模型训练的整体效率&#xff0c;助力 DeepR…

开源RAG,本地mac启动 dify源码服务

一、Dify文档 参考官方文档来操作&#xff0c;基本没太大的问题。一些细节&#xff0c;我在本篇文章中补充了出来。 这篇文章主要讲以源码的方式启动后端服务&#xff0c;前端服务使用容器启动。 dify 文档地址 欢迎使用 Dify | 中文 | Dify Dify 本地源码部署文档&#xff…

如何解读伊朗发布的直升机事故调查报告?一般事故调查报告应怎么写?

如何解读伊朗发布的直升机事故调查报告&#xff1f;一般事故调查报告应怎么写&#xff1f; 据央视新闻客户端消息&#xff1a;当地时间5月23日&#xff0c;伊朗武装部队总参谋部发布首份已故总统莱希及其随行人员乘坐的直升机事故调查报告。以下是#李秘书讲写作#对报告内容的解…

基于微信的家庭理财管理小程序的设计与实现(论文+源码)_kaic

摘 要 随着中国经济的飞速发展&#xff0c;家庭收入不断增高&#xff0c;人们的消费除了简单的维持日常生活之外&#xff0c;还有其他的消费方式&#xff0c;比如旅游、电商购物等&#xff0c;层出不穷的消费方式带给人快乐的同时&#xff0c;也常常让一些人逐渐无法把握住自…

【LeetCode】每日一题 2024_5_24 找出最具竞争力的子序列(栈,模拟,贪心)

文章目录 LeetCode&#xff1f;启动&#xff01;&#xff01;&#xff01;题目&#xff1a;找出最具竞争力的子序列题目描述代码与解题思路 每天进步一点点 LeetCode&#xff1f;启动&#xff01;&#xff01;&#xff01; 题目&#xff1a;找出最具竞争力的子序列 题目链接&a…

广义线性chirplet变换【附MATLAB代码】

文章来源&#xff1a;微信公众号&#xff1a;EW Frontier 摘要 时频分析方法是一种刻画信号时变特征的有效工具&#xff0c;在相当长的一段时间内受到了广泛的关注。随着TF算法的发展&#xff0c;许多先进的方法被提出&#xff0c;可以提供更精确的TF结果。但是&#xff0c;不…

【LabVIEW FPGA入门】使用事件发生函数同步FPGA循环

1.使用事件发生函数 使用 Occurrences 函数来控制单独的同步活动。特别是&#xff0c;当您希望程序框图的一部分等待程序框图的另一部分完成任务而不强制 LabVIEW 进行轮询时&#xff0c;请使用这些函数。 您可以使用全局变量执行类似于occurrences函数的功能&#xff0c;通过一…

详解CSS(二)

目录 1.背景属性 1.1背景颜色 1.2背景图片 1.3背景平铺 1.4背景位置 1.5背景尺寸 2.圆角矩形 3.元素的显示模式 3.1行内元素/内联元素&#xff08;Inline element&#xff09; 3.2块级元素&#xff08;Block-level element&#xff09; 3.3行内块元素&#xff08;In…

【leetcode面试经典150题】-80. 删除有序数组中的重复项 II

【leetcode面试经典150题】-80. 删除有序数组中的重复项 II 1 题目介绍2 个人解题思路2.1 代码2.2 思路 3 官方题解 1 题目介绍 给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组…

d20(184-190)-勇敢开始Java,咖啡拯救人生

目录 网络通信 网络通信三要素&#xff08;IP地址&#xff0c;端口号&#xff0c;协议 IP地址 InetAddress 端口号 协议 传输层的两个通信协议 UDP通信 java.net.Datagramsocket类 客户端 服务端 UDP通信多收多发 客户端 服务端 TCP通信 java.net.Socket类 客…

【全网最全】2024电工杯数学建模A题21页初步参考论文+py代码+保奖思路等(后续会更新)

您的点赞收藏是我继续更新的最大动力&#xff01; 一定要点击如下的卡片链接&#xff0c;那是获取资料的入口&#xff01; 【全网最全】2024电工杯数学建模A题21页初步参考论文py代码保奖思路等&#xff08;后续会更新成品论文&#xff09;「首先来看看目前已有的资料&#x…

企业应考虑的优秀云安全措施

作为云客户&#xff0c;企业有责任确保正确使用他们提供的工具来保证数据和应用程序的安全。让德迅云安全来跟大家一起研究一些典型企业应该考虑的优秀云安全措施。 在数据安全和隐私方面&#xff0c;企业是否在努力跟上疫情的发展?企业不是一个人。就像多年以前&#xff0c;C…

解决小皮面版搭建php网站数据库连接不了

首先进入mysql bin目录下 并执行cmd mysql -u root -pCREATE USER userlocalhost IDENTIFIED BY pass;GRANT ALL PRIVILEGES ON *.* TO userlocalhost;GRANT SELECT, INSERT, UPDATE ON database_name.* TO xxwlocalhost;FLUSH PRIVILEGES;select host ,user from mysql.user…

DOS学习-目录与文件应用操作经典案例-del

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一.前言 二.使用 三.案例 一.前言 DOS系统的del命令是一个用于删除文件的命令行工具。以下…

使用公共Wi-Fi所面临的风险有哪些

尽量不要使用公共wifi做转账、支付、修改密码等金融性或私密性的操作。公共Wi-Fi网络存在许多风险。尽管商家可能认为他们为顾客提供了一个有价值的服务&#xff0c;很多人也认为在星巴克噼里啪啦的乱敲键盘非常小资&#xff0c;但其实这些网络的安全性可能存在极大的漏洞&…

51打开工程,发现cannot read project file问题

解决办法&#xff1a; 1、路径太长&#xff0c;可以在桌面重新创建一个文件夹&#xff0c;把所有的文件都移动到新的文件夹中 2、创建工程的时候&#xff0c;都勾选上&#xff0c;就没问题

OracleDG原理

一、DataGuard架构介绍 1、基本介绍 在DG环境中&#xff0c;至少会有两个数据库&#xff0c;一个数据库处于Open状态&#xff0c;对外提供服务&#xff0c;这个数据库叫做primary Database。第二个数据库处于恢复状态&#xff0c;叫做Standby Database。运行时Primay Databas…

vue从入门到精通(四):MVVM模型

一,MVVM MVVM&#xff08;Model–view–viewmodel&#xff09;是一种软件架构模式。MVVM有助于将图形用户界面的开发与业务逻辑或后端逻辑&#xff08;数据模型&#xff09;的开发分离开来。详见MVVM 二,Vue中的MVVM Vue虽然没有完全遵循 MVVM 模型&#xff0c;但是 Vue 的设…

手机相册怎么恢复?如何挽救误删的照片?

手机相册成为我们存储和分享照片的主要途径&#xff0c;这些照片可能代表着我们的美好回忆、重要时刻或珍贵的瞬间。然而&#xff0c;有时候我们会因为误操作或一时冲动&#xff0c;将一些珍贵的照片误删&#xff0c;并且很难找回来。手机相册怎么恢复呢&#xff1f;本文将为你…

基于Tensorflow+Keras的卷积神经网络(CNN)人脸识别

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 人脸识别是计算机视觉领域的一个重要研究方向&#xff0c;广泛应用于安全监控、身份验证、人机…