当前位置: 首页 > news >正文

分布式锁 - 理论篇

一、为什么需要分布式锁

在这里插入图片描述

二、分布式锁实现

1.分布式锁演进 - 基本原理
在这里插入图片描述

我们可以同时去一个地方“占坑”,如果占到,就执行逻辑。否则就必须等待,直到释放锁。“占坑”可以去redis,可以去数据库,可以去任何大家都能访问的地方等待可以自旋的方式
2.分布式锁演进

(1) 分布式锁演进 — 阶段一

在这里插入图片描述
代码如下:

public Map<String,List<Catelog2Vo>> getCatalogJsonFromDbwithRedisLock(){//1、占分布式锁。去redis占坑Boolean lock = redisTemplate.opsForValue().setIfAbsent("lock""111");if(lock){//2、加锁成功... 执行业务Map<String,List<Catelog2Vo>> dataFromDb = getDataFromDb();//3、释放锁redisTemplate.delete( key: "lock");return dataFromDb}else {//加锁失败...重试。synchronized ()//休眠100ms重试//4.自旋的方式return getCatalogJsonFromDbwithRedisLock();}
}问题:如果第二步执行业务代码出异常或者机器断电等会导致第三步不能释放锁

(2)分布式锁演进 — 阶段二
在这里插入图片描述
代码如下:

public Map<String,List<Catelog2Vo>> getCatalogJsonFromDbwithRedisLock(){//1、占分布式锁。去redis占坑Boolean lock = redisTemplate.opsForValue().setIfAbsent("lock""111");if(lock){//1.1、设置过期时间,这样写问题:没有和加锁是同步的,不是原子的redisTemplate.expire( key: "lock", timeout: 30,TimeUnit.SECONDS)//2、加锁成功... 执行业务Map<String,List<Catelog2Vo>> dataFromDb = getDataFromDb();//3、释放锁redisTemplate.delete( key: "lock");return dataFromDb}else {//加锁失败...重试。synchronized ()//休眠100ms重试//4.自旋的方式return getCatalogJsonFromDbwithRedisLock();}
}问题:如果1.1加过期时间时机器断电等会导致第三步不能释放锁redisTemplate.opsForValue.setIfAbsent( "lock", "1111",300,TimeUnit.SECONDS):

(3)分布式锁演进 — 阶段三
在这里插入图片描述
代码如下:

public Map<String,List<Catelog2Vo>> getCatalogJsonFromDbwithRedisLock(){//1、占分布式锁。去redis占坑Boolean lock = redisTemplate.opsForValue.setIfAbsent( "lock", "1111",300,TimeUnit.SECONDS);if(lock){//2、加锁成功... 执行业务Map<String,List<Catelog2Vo>> dataFromDb = getDataFromDb();//3、释放锁redisTemplate.delete( key: "lock");return dataFromDb;}else {//加锁失败...重试。synchronized ()//休眠100ms重试//4.自旋的方式return getCatalogJsonFromDbwithRedisLock();}
}问题:释放锁失败会导致死锁

(4)分布式锁演进 — 阶段四 可在具体项目中使封装使用下面代码,但是建议使用专门的框架
在这里插入图片描述
使用 RedisTemplate 操作分布式锁

    public Map<String, List<Catelog2Vo>> getCatalogJsonFromDbWithRedisLock() {//1、占分布式锁。去redis占坑      设置过期时间必须和加锁是同步的,保证原子性(避免死锁)String uuid = UUID.randomUUID().toString();Boolean lock = stringRedisTemplate.opsForValue().setIfAbsent("lock", uuid,300,TimeUnit.SECONDS);if (lock) {System.out.println("获取分布式锁成功...");Map<String, List<Catelog2Vo>> dataFromDb = null;try {//2.加锁成功...执行业务dataFromDb = getDataFromDb();} finally {//3.删除锁  lua脚本解锁String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) " +"else return 0 end";stringRedisTemplate.execute(new DefaultRedisScript<>(script,Long.class), Arrays.asList("lock"), uuid);//下面不能这样写  // 先去redis查询下保证当前的锁是自己的//获取值对比,对比成功删除=原子性 // String lockValue = stringRedisTemplate.opsForValue().get("lock");// if (uuid.equals(lockValue)) {//     //删除我自己的锁//     stringRedisTemplate.delete("lock");// }}return dataFromDb;} else {System.out.println("获取分布式锁失败...等待重试...");//4. 加锁失败...重试机制,要根据具体业务决定下面需不需要写//休眠一百毫秒try { TimeUnit.MILLISECONDS.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); }return getCatalogJsonFromDbWithRedisLock();     //自旋的方式}}

相关文章:

分布式锁 - 理论篇

一、为什么需要分布式锁 二、分布式锁实现 1.分布式锁演进 - 基本原理 我们可以同时去一个地方“占坑”&#xff0c;如果占到&#xff0c;就执行逻辑。否则就必须等待&#xff0c;直到释放锁。“占坑”可以去redis&#xff0c;可以去数据库&#xff0c;可以去任何大家都能访…...

复杂的菱形继承及菱形虚拟继承(详解)

复杂的菱形继承及菱形虚拟继承 复杂的菱形继承及菱形虚拟继承虚拟继承解决数据冗余和二义性的原理笔试面试题 复杂的菱形继承及菱形虚拟继承 单继承&#xff1a;一个子类只有一个直接父类时称这个继承关系为单继承 多继承&#xff1a;一个子类有两个或以上直接父类时称这个继…...

【快捷测试模型是否可以跑通】设置一张图片的张量形式,送入自己写的模型进行测试

文章目录 1. 1. import torch.nn as nn import torch from einops import rearrange, repeat from einops.layers.torch import Rearrange import torch.nn.functional as Fclass PreNorm(nn.Module):def __init__(self, dim, fn):super().__init__()self.norm nn.LayerNorm(…...

软考系列(系统架构师)- 2019年系统架构师软考案例分析考点

试题一 软件架构&#xff08;架构风格、质量属性&#xff09; 【问题1】&#xff08;13分&#xff09; 针对用户级别与折扣规则管理功能的架构设计问题&#xff0c;李工建议采用面向对象的架构风格&#xff0c;而王工则建议采用基于规则的架构风格。请指出该系统更适合采用哪种…...

安防视频监控系统EasyCVR视频汇聚存储平台定制化开发:新增kafka配置

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台可拓展性强、…...

C++设计模式_08_Factory Method工厂方法模式

文章目录 1. “对象创建模式”模式1.1 典型模式 2. 动机&#xff08;Motivation&#xff09;3. 代码演示Factory Method工厂方法模式3.1 常规方法3.2 面向接口的编程3.2.1 FileSplitter1.cpp3.2.2 MainForm1.cpp 3.3 Factory Method工厂方法3.3.1 ISplitterFactory.cpp3.3.2 Ma…...

【TensorFlow1.X】系列学习笔记【基础一】

【TensorFlow1.X】系列学习笔记【基础一】 大量经典论文的算法均采用 TF 1.x 实现, 为了阅读方便, 同时加深对实现细节的理解, 需要 TF 1.x 的知识 文章目录 【TensorFlow1.X】系列学习笔记【基础一】前言线性回归非线性回归逻辑回归总结 前言 本篇博主将用最简洁的代码由浅入…...

Linux 基础操作手记三(内存篇)

Linux 基础操作手记三 释放内存虚拟机彻底无网络测试网速设置虚拟内存交换空间未使用虚拟机设置虚拟内存无法开机问题GParted - 分配内存系统盘扩容自己 释放内存 sync && echo 3 > /proc/sys/vm/drop_caches 虚拟机彻底无网络 还原默认设置&#xff0c;静静的等待…...

NodeJS的初使用,以及引入第三方插件和安装淘宝镜像的教程

NodeJs 命令 npm init -y 生成package.json文件npm i jquery --save–dev 开发依赖(jQuery后面还可以跟模块,可以有多个)npm i jquery --save 生产依赖npm i jquery --D 开发依赖npm uninstall jquery 卸载删除npm i 把删掉的模块,全部重新加载回来 1.介绍 1.什么是NodeJs?…...

Java读取文件的N种方法

1.概述 在这篇文章里&#xff0c; 我们将探索不同的方式从文件中读取数据。 首先&#xff0c; 学习通过标准的的Java类&#xff0c;从classpath、URL或者Jar中加载文件。 然后&#xff0c;学习通用BufferedReader, Scanner, StreamTokenizer, DataInputStream, SequenceInput…...

子类的构造与析构过程

一、简介 父类&#xff0c;也称基类&#xff0c;其构造方法和析构方法不能被继承&#xff1b; 子类&#xff0c;也称派生类&#xff0c;继承父类的方法和属性&#xff0c;但要加入新的构造和析构函数。 二、构造与析构过程 构造&#xff1a;先调用父类——>再调用子类 析构&…...

位运算相关笔记

位运算 Part 1&#xff1a;基础 左移&#xff1a;左移一位&#xff0c;相当于某数乘以 2 2 2。左移 x x x位,相当于该数乘以 2 x 2^x 2x。 右移&#xff1a;右移一位&#xff0c;相当于某数除以 2 2 2。右移 x x x位&#xff0c;相当于该数除以 2 x 2^x 2x。 与运算&…...

uniapp 安装 u-view 组件库

u-view 组件库安装教程&#xff1a;https://uviewui.com/components/install.html 注&#xff1a;以下使用 HBuilderx 安装 u-view 2.0 版本&#xff0c;不适用于其它版本。 1.安装 u-view 组件库 2、注册并登录 HBuilderx 账号&#xff0c;点击下载 u-view 组件库。 3、点击…...

Go 语言的成功案例:谁在使用 Go?

Go 语言&#xff0c;也被称为 Golang&#xff0c;是一门由Google开发的开源编程语言。自从2009年首次亮相以来&#xff0c;它在编程社区中崭露头角&#xff0c;并吸引了越来越多的开发者和组织。Go 以其高效的并发性、出色的性能和简单易懂的语法而闻名。在本文中&#xff0c;我…...

UG\NX二次开发 实时查看 NX 日志文件

文章作者:里海 来源网站:王牌飞行员_里海_里海NX二次开发3000例,里海BlockUI专栏,C\C++-CSDN博客 感谢粉丝订阅 感谢 a18037198459 订阅本专栏,非常感谢。 简介 实时查看 NX 日志文件,有助于分析保存时间等。打开WindowsPowerShell并实时获取日志文件内容的小功能。 效果 代…...

ZooKeeper+HBase分布式集群环境搭建

安装版本&#xff1a;hadoop-2.10.1、zookeeper-3.4.12、hbase-2.3.1 一、zookeeper集群搭建与配置 1.下载zookeeper安装包 2.解压移动zookeeper 3.修改配置文件&#xff08;创建文件夹&#xff09; 4.进入conf/ 5.修改zoo.cfg文件 6.进入/usr/local/zookeeper-3.4.12/zkdata…...

喜讯!持安科技入选2023年北京市知识产权试点单位!

近日&#xff0c;北京市知识产权局发布了“2023年度北京市知识产权试点示范单位及2020年度北京市知识产权试点示范单位复审通过名单”名单。 经过严格的初审、形式审核和专家评审&#xff0c;北京持安科技有限公司入选“2023年北京市知识产权试点单位”。 北京市知识产权试点示…...

笙默考试管理系统-MyExamTest----codemirror(39)

笙默考试管理系统-MyExamTest----codemirror&#xff08;39&#xff09; 目录 一、 笙默考试管理系统-MyExamTest 二、 笙默考试管理系统-MyExamTest 三、 笙默考试管理系统-MyExamTest 四、 笙默考试管理系统-MyExamTest 五、 笙默考试管理系统-MyExamTest 笙默考试…...

抛砖引玉:Redis 与 接口自动化测试框架的结合

接口自动化测试已成为保证软件质量和稳定性的重要手段。而Redis作为一个高性能的缓存数据库&#xff0c;具备快速读写、多种数据结构等特点&#xff0c;为接口自动化测试提供了强大的支持。勇哥这里粗略介绍如何结合Python操作Redis&#xff0c;并将其应用于接口自动化测试框架…...

网站如何才能不被黑,如何做好网络安全

当企业网站受到攻击时&#xff0c;首页文件可能被篡改&#xff0c;百度快照也可能被劫持并重定向到其他网站。首要任务是加强网站的安全防护。然而&#xff0c;许多企业缺乏建立完善的网站安全防护体系的知识。因此&#xff0c;需要专业的网站安全公司来提供相应的保护措施。今…...

小程序富文本组件mp-html:打破微信原生限制的终极解决方案

小程序富文本组件mp-html&#xff1a;打破微信原生限制的终极解决方案 【免费下载链接】mp-html 小程序富文本组件&#xff0c;支持渲染和编辑 html&#xff0c;支持在微信、QQ、百度、支付宝、头条和 uni-app 平台使用 项目地址: https://gitcode.com/gh_mirrors/mp/mp-html…...

从一次内部安全测试复盘讲起:我们是如何在3天内修复了20+个‘访问控制损坏’漏洞的

从内部安全测试到系统加固&#xff1a;3天修复20访问控制漏洞的实战记录 那天下午&#xff0c;当渗透测试报告出现在团队Slack频道时&#xff0c;整个技术部陷入了短暂的沉默。报告首页用红色标注的"Critical"字样格外刺眼——我们的核心业务系统在模拟攻击中暴露出2…...

《讨论:利用Ozon图片在1688找相似款,算不算一种高效的“信息差”套利?》

这是一个非常值得深入探讨的电商运营实战话题。将Ozon(俄罗斯主流电商平台)的潜力爆款“搬运”到1688找相似款,本质上是在利用跨境市场信息差、审美差和时间差套利,是一种经典但门槛正在提高的“货品策略”。 下面我们从几个维度深入剖析这个玩法的本质、可行性和未来演变…...

无真实标签场景下的回归模型监控策略与实践

1. 无真实标签场景下的回归模型监控困境在真实业务场景中&#xff0c;我们常常遇到一个尴尬局面&#xff1a;模型上线后&#xff0c;新数据的真实标签&#xff08;ground-truth&#xff09;往往需要数天甚至数周才能获取。以金融风控场景为例&#xff0c;一笔贷款申请的真实违约…...

AI催眠师:模型行为矫正专家

从“黑盒”到“可引导”的模型测试新范式在软件测试的传统疆域里&#xff0c;我们习惯于与确定性的代码逻辑、清晰的输入输出边界以及可复现的缺陷打交道。然而&#xff0c;随着以大型语言模型&#xff08;LLM&#xff09;为代表的生成式人工智能系统成为核心组件&#xff0c;测…...

保姆级教程:在Ubuntu 20.04 ROS Noetic下,用奥比中光Astra Pro摄像头完成棋盘格标定(附常见报错解决)

奥比中光Astra Pro摄像头ROS标定实战指南&#xff1a;从零到精准 引言 在机器人视觉和三维感知领域&#xff0c;摄像头标定是构建可靠感知系统的第一步。奥比中光Astra Pro作为一款高性价比的体感摄像头&#xff0c;广泛应用于SLAM、手势识别、三维重建等场景。本文将手把手带你…...

小说下载器:一键保存200+网站小说,打造永不消失的个人数字图书馆

小说下载器&#xff1a;一键保存200网站小说&#xff0c;打造永不消失的个人数字图书馆 【免费下载链接】novel-downloader 一个可扩展的通用型小说下载器。 项目地址: https://gitcode.com/gh_mirrors/no/novel-downloader 在数字阅读时代&#xff0c;你是否曾经历过心…...

别再用pip直接装了!用Anaconda给LabelImg创建专属虚拟环境,告别闪退和版本冲突

别再用pip直接装了&#xff01;用Anaconda给LabelImg创建专属虚拟环境&#xff0c;告别闪退和版本冲突 如果你曾经在安装LabelImg时遇到过闪退、报错或者莫名其妙的版本冲突&#xff0c;这篇文章就是为你准备的。作为一个长期与Python环境打交道的开发者&#xff0c;我深刻理解…...

终极Windows系统优化工具:一键解决软件安装、系统优化和故障修复

终极Windows系统优化工具&#xff1a;一键解决软件安装、系统优化和故障修复 【免费下载链接】winutil Chris Titus Techs Windows Utility - Install Programs, Tweaks, Fixes, and Updates 项目地址: https://gitcode.com/GitHub_Trending/wi/winutil 还在为Windows系…...

掌握Notepad--:国产跨平台文本编辑器的终极实用指南

掌握Notepad--&#xff1a;国产跨平台文本编辑器的终极实用指南 【免费下载链接】notepad-- 一个支持windows/linux/mac的文本编辑器&#xff0c;目标是做中国人自己的编辑器&#xff0c;来自中国。 项目地址: https://gitcode.com/GitHub_Trending/no/notepad-- Notepa…...