Java面试之分布式篇

分布式锁的实现方案

(1)用数据库实现分布式锁比较简单,就是创建一张锁表,数据库对字段作唯一性约束。加锁的时候,在锁表中增加一条记录即可;释放锁的时候删除锁记录就行。如果有并发请求同时提交到数据库,数据库会保证只有一个请求能够得到锁。这种属于数据库IO操作,效率不高,而且频繁操作会增大数据库的开销,因此这种方式在高并发、高性能的场景中用的不多。
(2)基于redis分布式锁:
①理论上来说使用缓存来实现分布式锁的效率最高,加锁速度最快,因为Redis几乎都是纯内存操作,而基于数据库的方案和基于Zookeeper的方案都会涉及到磁盘文件IO,效率相对低下。
②redis提供了SETNX命令去实现锁的排他性,当key不存在返回1,存在返回0,还可以使用expire命令去设置锁的失效时间从而避免死锁的问题。对于加锁与设置过期时间是非原子操作,我们可以使用Lua脚本。Redisson框架提供了一个分布式锁的封装实现,并且内置了一个叫看门狗Watch Dog的机制,来对加锁成功后还想继续持有锁的进行key的续期。
③如果线程1在Redis的master节点上拿到了锁,但是加锁的key还没同步到slave节点。恰好这时,master节点发生了故障,一个slave节点就会升级为master节点。线程2就可以获取到这个key的锁了,但是线程1已经拿到锁了,锁的安全性就没有了,可以使用RedLock。
(3)基于Zookeeper:Zookeeper利用临时有序节点实现分布式锁。(缺点:客户端在持有锁期间,需要定期向Zookeeper发送心跳,以保持锁的状态。如果客户端因为异常退出或网络故障等原因无法发送心跳,Zookeeper会认为客户端已经释放了锁。)
在这里插入图片描述
在zookeeper中建一个分布式锁的节点。
步骤1:客户端A在锁的节点创建一个临时有序节点001
步骤2:看001是不是第一个节点,看序号有没有比它小的,是第一个节点就获取到锁。
步骤3:客户端B创建临时有序节点002
步骤4:判断002是否是第一个节点,不是第一个节点则给上一个节点用watch加监听器。
步骤5:客户端A执行完业务逻辑后,需要释放锁了,删除临时有序节点
步骤5:等到第一个节点释放锁,删除了节点后就会被002监听到。
步骤6:zookeeper通知客户端B第一个节点被删除了。
步骤8:此时客户端B就会再次判断自己是不是第一个节点
步骤9:是的话就会加锁成功
补充:
1.1 zookeeper节点分类:
①临时节点:与客户端断开连接后删除
a.临时目录节点:节点名称不编号
b.临时有序节点:节点名称进行顺序编号
②持久节点:与客户端断开连接后不删除
a.持久目录节点:节点名称不编号
b.持久有序节点:节点名称进行顺序编号
1.2 临时有序节点可以通过watch命令监听到节点的增删改

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

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

相关文章

css-页面布局-定位大解析-每文一言(世界上,没有人可以支持你一辈子)

🎐每文一言 世界上,没有人可以支持你一辈子 目录 🎐每文一言 🎁css定位 🧧静态定位 position: static 🎄相对定位 position:relative 🎀绝对定位 position:absolute 🎃固定定位 position…

Yoast SEO Premium插件下载,提升您的网站SEO排名

在当今数字化时代,网站的搜索引擎优化(SEO)至关重要。它不仅影响着网站的可见度,更直接关系到您的在线业务成功与否。如果您正在寻找一个能够显著提升网站SEO表现的工具,Yoast SEO Premium插件将是您的理想选择。 为什…

赶紧收藏!2024 年最常见 100道 Java 基础面试题(四十一)

上一篇地址:赶紧收藏!2024 年最常见 100道 Java 基础面试题(四十)-CSDN博客 八十一、tcp为什么要三次握手,两次不行吗?为什么? TCP(传输控制协议)使用三次握手&#xf…

【Linux网络】Shell脚本语句

目录 一、条件语句 1.1 测试 1.2 比较整数数值 1.3 字符串比较 1.4 双中括号 1.5 ()与{} 1.6 if语句 1.7 case语句 1.8 echo命令 二、循环语句 2.1 for循环 2.2 while循环 2.3 until循环 一、条件语句 1.1 测试 格式一:test 条件表达式 格式二&#x…

AI技术如何提升内容生产的效率和质量

随着人工智能(AI)技术的不断发展和应用,内容生产领域也迎来了巨大的变革。AI技术在提升内容生产效率和质量方面发挥着越来越重要的作用,从自然语言处理到生成模型,AI为内容创作者和生产者带来了许多新的机会和挑战。本…

(docker)进入容器后如何使用本机gpu

首次创建容器,不能直接使用本机gpu 在系统终端进行如下配置: 1.安装NVIDIA Container Toolkit 进入Nvidia官网Installing the NVIDIA Container Toolkit — NVIDIA Container Toolkit 1.15.0 documentation,安装NVIDIA Container Toolkit …

AI预测福彩3D采取887定位策略+杀断组+杀和尾+杀和值012缩水测试5月12日预测第1弹

前段时间工作太忙,手头上各种事情较多,没有静下心来对我的AI模型预测结果进行进一步分析筛选,导致最近连续几期与实际开奖结果相差较大。当然,客观来说,搞6码定位的确难度比较大,昨天跟几个常年研究3D的彩友…

OpenCV 光流法总结

0.概述 1.原理说明 2.代码实现 #include <iostream> #include <opencv2/opencv.hpp>int main(int argc, char** argv) {if(argc ! 2) {std::cerr << "Usage: " << argv[0] << " <video_path>" << std::endl;…

从零学算法2391

2391. 收集垃圾的最少总时间 给你一个下标从 0 开始的字符串数组 garbage &#xff0c;其中 garbage[i] 表示第 i 个房子的垃圾集合。garbage[i] 只包含字符 ‘M’ &#xff0c;‘P’ 和 ‘G’ &#xff0c;但可能包含多个相同字符&#xff0c;每个字符分别表示一单位的金属、纸…

商业时代杂志社投稿信箱邮箱

商业时代杂志投稿信箱邮箱 商业时代杂志 《商业时代》、投稿信箱&#xff1a;sysdbjb126.com 《商业时代》、投稿信箱&#xff1a;sysdbjb126.com 《商业时代》、投稿信箱&#xff1a;sysdbjb126.com 《商业时代》、投稿信箱&#xff1a;sysdbjb126.com 咨询电话&#xf…

【RAG 论文】FiD:一种将 retrieved docs 合并输入给 LM 的方法

论文&#xff1a; Leveraging Passage Retrieval with Generative Models for Open Domain Question Answering ⭐⭐⭐⭐ EACL 2021, Facebook AI Research 论文速读 在 RAG 中&#xff0c;如何将检索出的 passages 做聚合并输入到生成模型是一个问题&#xff0c;本文提出了一…

java基础知识点总结2024版(8万字超详细整理)

java基础知识点总结2024版&#xff08;超详细整理&#xff09; 这里写目录标题 java基础知识点总结2024版&#xff08;超详细整理&#xff09;java语言的特点1.简单性2.面向对象3.分布式4.健壮性5.安全性6.体系结构中立7.可移植性8.解释性9.多线程10.动态性 初识java中的main方…

Web前端开发之JavaScript_2

条件语句三元运算符循环语句字符串数组 1. 条件语句 1.1 if语句 if (布尔值){ // “布尔值”往往由一个表达式产生&#xff0c;其中&#xff0c;赋值表达式不具备比较作用 语句; } 1.2 if...else 语句 if...else可成对单独使用&#xff0c;也可多层if...else …

十二届蓝桥杯Python组3月中/高级试题 第三题

** 十二届蓝桥杯Python组3月中/高级试题 第三题 ** 第三题&#xff08;难度系数 3&#xff0c;25 个计分点&#xff09; 提示信息&#xff1a; 心理学用“智力商数”即“IQ”来表示一个人的智力水平。经过研究划分&#xff0c;智力水平可分为7 个等级&#xff1a; 1、IQ≥140…

Java类与对象(一)

类的定义与使用 在Java中使用关键字class定义一个类&#xff0c;格式如下&#xff1a; class 类名{// 成员变量/字段/属性//成员方法/行为 }Java中类和c语言中的结构体有点类似&#xff0c; 在Java中类名一般采用大驼峰&#xff08;每个首字母大写&#xff09;的形式&#xf…

类和对象一(从封装开始讲述)

目录&#xff1a; 一.封装 二.封装扩展之包&#xff0c;自定义包 三.访问限定符 四.static成员 一.封装&#xff1a;封装&#xff1a;将数据和操作数据的方法进行有机结合&#xff0c;隐藏对象的属性和实现细节&#xff0c;仅对外公开接口来和对象进行 交互。面向对象…

Python | 为列表中的元素分配唯一值

我们可以给列表中的所有数字分配一个唯一的值&#xff0c;重复时它会保留给它的值。这是一个非常常见的问题&#xff0c;在Web开发中&#xff0c;处理物品id时会遇到。让我们讨论一下解决这个问题的一些方法。 1. 使用enumerate() 列表解析 # initializing list test_list …

Reactor Netty TCP 服务器端-响应式编程-011

🤗 ApiHug {Postman|Swagger|Api...} = 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱,有温度,有质量,有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace The Next Generation API Development Platform…

Pytorch图像分类模型模型实时在线验证代码

1.训练并保存自己的模型 保存的模型格式为&#xff1a;XXX.pth torch.save(model, "./weight/last.pth")if best_acc <(validation_acc / len_val):torch.save(model, "./weight/best.pth")2.转化为ONNX格式 2.1环境安装&#xff08;window10&#x…

一款简约大气的个人单页介绍主页(附加源码)

一款简约大气的个人单页介绍主页&#xff08;附加源码&#xff09; 效果图部分源码领取源码下期更新预报 效果图 部分源码 .box_bg{width: 100%;height: 100%; }.wenzi{text-align: center;float: left;display: inline;width: 112px;line-height: 48px; } .wenzi2{text-align…