分布式锁-Redisson实现

       

目录

本地锁的局限性

Redisson解决分布式锁问题

         


        在分布式环境下,分布式锁可以保证在多个节点上的并发操作时数据的一致性和互斥性。分布式锁有多种实现方案,最常用的两种方案是:zookeeper和redis,本文介绍redis实现分布式锁方案。

本地锁的局限性

        JDK中自带的synchronized及lock锁,这些锁都是本地锁,在一个节点服务(一个JVM)下可以实现“锁”的效果,一旦服务多实例,本地锁就会存在问题。下方示例演示并发对redis的值做自增操作,观察效果,步骤如下:

        1、编写请求和服务接口

        此代码的主要逻辑是redis中key=num的值每次+1(初始值是0),其中redisTest方法上加上本地锁(synchronized)

@GetMapping("/redisTest")
public GenericWebResult redisTest() {Long result = this.blogContentService.redisTest();log.info("设置redis中num值:{}",result);return GenericWebResult.ok((Object) "测试成功",result);
}
@Override
public synchronized Long redisTest() throws BusinessException {Long result = 0l;String key = "num";RBucket<Object> bucket = this.redissonClient.getBucket(key);if(bucket != null) {Long ori = (Long)bucket.get();result = ori.longValue() + 1;this.redissonClient.getBucket(key).set(result);}return result;
}

        2、单个实例启动后,用jemter并发请求测试 

        单实例启动后,服务端口:8888,jemter通过100个线程并发请求访问后,redis中key=num的值是100,符合预期。

 

        3、后台服务启动多个实例, 再次用jemter并发请求测试 

        后台服务启动了2个实例,端口分别是8888和9999,并通过网关gateway对外公布统一的请求地址,网关会自动均衡到端口是8888和9999的2个服务中(这部分的配置不在此文赘述,详情见网关Gateway-CSDN博客),网关服务的端口是7777,请求的统一地址是:http://localhost:7777/blog-content/blogContent/redisTest ,通过jmeter测试如下(num初始恢复到0):

        执行后,发现redis中key=num的值变成了65,不是100,不符合预期,证明本地锁在分布式环境下是有局限性的,它只能保证在一个JVM下锁的有效性。

Redisson解决分布式锁问题

        Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务,其中就包含了各种分布式锁的实现。使用Redisson实现分布式锁,需要如下步骤:

        1、项目添加依赖

<!-- redisson -->
<dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><exclusions><exclusion><groupId>org.redisson</groupId><artifactId>redisson-spring-data-23</artifactId></exclusion></exclusions>
</dependency>
<dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-data-26</artifactId><version>3.47.0</version>
</dependency>

        2、改造redisTest方法,引入锁

        通过redissonClient.getLock获取锁,在执行业务逻辑前锁住lock.lock(),执行完业务逻辑后释放锁lock.unlock()

@Override
public Long redisTest() throws BusinessException {Long result = 0l;RLock lock = redissonClient.getLock("lock");lock.lock();//业务逻辑try {log.info("业务逻辑开始...");Thread.sleep(1000);//模拟业务逻辑时长String key = "num";RBucket<Object> bucket = this.redissonClient.getBucket(key);if(bucket != null) {Long ori = (Long)bucket.get();result = ori.longValue() + 1;this.redissonClient.getBucket(key).set(result);}log.info("业务逻辑结束...");} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();log.info("redis 解锁...");}return result;
}

        3、和第一章节一样,后台服务同样启动2个实例,端口分别是8888和9999,用jmeter模拟并发请求网关端口。

 

        从后台请求日志可以看出,2个服务每隔1秒获取到锁,然后执行业务逻辑(num++),最终num的值是100,符合预期,实现了分布式环境下锁的效果。

 

        

        

        

        

         

        

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

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

相关文章

【办公类-48-04】202506每月电子屏台账汇总成docx-5(问卷星下载5月范围内容,自动获取excel文件名,并转移处理)

背景需求&#xff1a; 1-4月电子屏表格&#xff0c;都是用这个代码将EXCEL数据整理成分类成3个WORD表格。 【办公类-48-04】20250118每月电子屏台账汇总成docx-4&#xff08;提取EXCLE里面1月份的内容&#xff0c;自制月份文件夹&#xff09;-CSDN博客文章浏览阅读1.2k次&…

【websocket】安装与使用

websocket安装与使用 1. 介绍2. 安装3. websocketpp常用接口4. Websocketpp使用4.1 服务端4.2 客户端 1. 介绍 WebSocket 是从 HTML5 开始支持的一种网页端和服务端保持长连接的 消息推送机制。 传统的 web 程序都是属于 “一问一答” 的形式&#xff0c;即客户端给服务器发送…

微算法科技(NASDAQ:MLGO)基于信任的集成共识和灰狼优化(GWO)算法,搭建高信任水平的区块链网络

随着数字化转型的加速&#xff0c;区块链技术作为去中心化、透明且不可篡改的数据存储与交换平台&#xff0c;正逐步渗透到金融、供应链管理、物联网等多个领域&#xff0c;探索基于信任的集成共识机制&#xff0c;并结合先进的优化算法来提升区块链网络的信任水平&#xff0c;…

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…

贝叶斯优化+LSTM+时序预测=Nature子刊!

贝叶斯优化与LSTM的融合在时间序列预测领域取得了显著成效&#xff0c;特别是在处理那些涉及众多超参数调整的复杂问题时。 1.这种结合不仅极大提高了预测的精确度&#xff0c;还优化了模型训练流程&#xff0c;提升了效率和成本效益。超参数优化的新篇章&#xff1a;LSTM因其…

AWSLambda之设置时区

目标 希望Lambda运行的时区是东八区。 解决 只需要设置lambda的环境变量TZ为东八区时区即可&#xff0c;即Asia/Shanghai。 参考 使用 Lambda 环境变量

RAG系统向量数据库选型与Prompt Engineering鲁棒性测试实践

引言 在AI应用不断落地的今天&#xff0c;RAG&#xff08;Retrieval-Augmented Generation&#xff0c;检索增强生成&#xff09;和Prompt Engineering&#xff08;提示工程&#xff09;成为大模型工程师和测试工程师的核心武器。 一方面&#xff0c;RAG系统依赖强大的向量数据…

2.Socket 编程 UDP

1.UDP网络编程 0.背景知识 自实现IP转化 相关函数理解 IP相关理解 1. V2版本 - DictServer封装版 实现一个简单的英译汉的网络字典 Dict.hpp dictionary.txt InetAddr.hpp • 在 InetAddr 中&#xff0c;重载一下方便对用户是否是同一个进行比较 Log.hpp makefile Mutex.hpp…

数据可视化交互

目录 【实验目的】 【实验原理】 【实验环境】 【实验步骤】 一、安装 pyecharts 二、下载数据 三、实验任务 实验 1&#xff1a;AQI 横向对比条形图 代码说明&#xff1a; 运行结果&#xff1a; 实验 2&#xff1a;AQI 等级分布饼图 实验 3&#xff1a;多城市 AQI…

【MATLAB去噪算法】基于CEEMDAN联合小波阈值去噪算法(第四期)

CEEMDAN联合小波阈值去噪算法相关文献 一、EMD 与 EEMD 的局限性 &#xff08;1&#xff09;EMD (经验模态分解) 旨在自适应地将非线性、非平稳信号分解成一系列 本征模态函数 (IMFs)&#xff0c;这些 IMFs 从高频到低频排列。 核心问题&#xff1a;模态混合 (Mode Mixing) 同…

大话软工笔记—架构模型

1. 架构模型1—拓扑图 &#xff08;1&#xff09;拓扑图概念 拓扑图&#xff0c;将多个软件系统用网络图连接起来的表达方式。 &#xff08;2&#xff09;拓扑图分类 总线型结构 比较普遍采用的方式&#xff0c;将所有的系统接到一条总线上。 星状结构 各个系统通过点到…

24-Oracle 23 ai ​Lock-Free Reservations​(无锁列值保留)

数据库领域为了解决ACID的平衡&#xff0c;尝试了各种锁、各种模式&#xff0c; 引擎技术特性、厂家实现方式各放异彩&#xff0c;被各种锁折磨的小伙伴&#xff0c;是不是感同身受。 一、数据库锁 1. 锁的类型与特点 ​全局锁​&#xff1a;锁定整个数据库实例&#xff0c;备…

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding

从零写一个ALSA声卡驱动学习(1)

前言&#xff1a; 本文档描述了如何编写 ALSA&#xff08;高级 Linux 音频架构&#xff09;驱动程序。文档主要聚焦于 PCI 声卡的实现。对于其他类型的设备&#xff0c;可能会使用不同的 API。不过&#xff0c;至少 ALSA 的内核 API 是一致的&#xff0c;因此本文档在编写这些驱…

链结构与工作量证明7️⃣:用 Go 实现比特币的核心机制

链结构与工作量证明:用 Go 实现比特币的核心机制 如果你用 Go 写过区块、算过哈希,也大致理解了非对称加密、数据序列化这些“硬核知识”,那么恭喜你,现在我们终于可以把这些拼成一条完整的“区块链”。 不过别急,这一节我们重点搞懂两件事: 区块之间是怎么连接成“链”…

深入理解 React 样式方案

React 的样式方案较多,在应用开发初期,开发者需要根据项目业务具体情况选择对应样式方案。React 样式方案主要有: 1. 内联样式 2. module css 3. css in js 4. tailwind css 这些方案中,均有各自的优势和缺点。 1. 方案优劣势 1. 内联样式: 简单直观,适合动态样式和…

YOLO电力物目标检测训练

最近需要进行电力物检测相关的业务&#xff0c;因此制作了一个电力物数据集&#xff0c;使用YOLO目标检测方法进行实验&#xff0c;记录实验过程如下&#xff1a; 数据集标注 首先需要对电力物相关设备进行标注&#xff0c;这里我们选用labelme进行标注&#xff0c;使用无人机…

从阿里云域名解析异常事件看下域名解析过程

近日阿里云核心域名aliyuncs.com解析异常&#xff0c;涉及众多依赖阿里云服务的网站和应用&#xff0c;故障从发现到修复耗时5个多小时。本文简要分析下整个事件的过程&#xff0c;并分析域名解析的过程&#xff0c;了解根域名服务器在其中的作用&#xff0c;以了解。 1、aliyu…

应用分享 | 精准生成和时序控制!AWG在确定性三量子比特纠缠光子源中的应用

在量子技术飞速发展的今天&#xff0c;实现高效稳定的量子态操控是推动量子计算、量子通信等领域迈向实用化的关键。任意波形发生器&#xff08;AWG&#xff09;作为精准信号控制的核心设备&#xff0c;在量子实验中发挥着不可或缺的作用。丹麦哥本哈根大学的研究团队基于单个量…

基于规则的自然语言处理

基于规则的自然语言处理 规则方法形态还原&#xff08;针对英语、德语、法语等&#xff09;中文分词切分歧义分词方法歧义字段消歧方法分词带来的问题 词性标注命名实体分类机器翻译规则方法的问题 规则方法 以规则形式表示语言知识&#xff0c;强调人对语言知识的理性整理&am…