适用Java SpringBoot项目的分布式锁

在分布式系统中,常用到分布式锁,它有多中实现方式,如:基于redis,database,zookeeper等。Spring integration组件有这三种服务的分布式锁实现,今天来看看用的比较多的redis和database实现方式。

第一种:Spring原生-基于Redis的分布式锁:

1. 需要加入以下依赖,第一个是spring boot integration模块,一个是integration redis实现模块。

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-integration</artifactId>
</dependency>
<dependency>
     <groupId>org.springframework.integration</groupId>
     <artifactId>spring-integration-redis</artifactId>
</dependency>

2. 配置RedisLockRegistry Bean,有了这个Bean之后,就可以用来加锁、解锁了,Spring框架中有继承redis的实现和异常处理,我们可以方便且稳定的使用。

@Configuration
public class LockConfig {

     @Bean
     public RedisLockRegistry redisLockRegistry(RedisConnectionFactory redisConnectionFactory) {
         return new RedisLockRegistry(redisConnectionFactory, "test",60);
     }
}

3. 加锁、解锁。在需要分布式加锁的时候,先通过redisLockRegistry获取到lock对象,然后用lock对象加锁(可以设置等待尝试时间,到点自动放弃,不加时间默认立即放弃),处理完业务之后一定要记得解锁。

Lock lock = redisLockRegistry.obtain(lockKey);

if (lock.tryLock(0L, TimeUnit.SECONDS)) {

    log.info("获取到锁,执行业务代码...");

} else {
    log.info("很遗憾没获取到锁。");
}

lock.unlock();

 

第二种:Spring原生-基于DB的分布式锁:

1. 需要加入以下依赖,第一个是spring boot integration模块,一个是integration jdbc实现模块。

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-integration</artifactId>
</dependency>
<dependency>
     <groupId>org.springframework.integration</groupId>
     <artifactId>spring-integration-jdbc</artifactId>
</dependency>

2. 配置JdbcLockRegistry Bean,有了这个Bean之后,就可以用来加锁、解锁了,Spring框架中有继承redis的实现和异常处理,我们可以方便且稳定的使用。

@Configuration
public class LockConfig {

     @Bean
    public JdbcLockRegistry getJdbcLockRegistry(DataSource dataSource, ApplicationContext applicationContext) {
        DefaultLockRepository lockRepository = new DefaultLockRepository(dataSource);
        lockRepository.setApplicationContext(applicationContext); //必须设置applicationContext
        lockRepository.afterSingletonsInstantiated(); //在LockRepository实例化后必须调用这个方法,否则后面会报事务对象空指针错误
        lockRepository.setPrefix("spring_"); //分布式锁表前缀,自定义
        lockRepository.setTimeToLive(60000); //锁存活时间60s
        lockRepository.afterPropertiesSet(); //属性设置结束后必须调用此方法,格式化加锁、解锁SQL语句
        return new JdbcLockRegistry(lockRepository);
    }
}

3. 加锁、解锁。在需要分布式加锁的时候,先通过jdbcLockRegistry获取到lock对象,然后用lock对象加锁(可以设置等待尝试时间,到点自动放弃,不加时间默认立即放弃),处理完业务之后一定要记得解锁。

Lock lock = jdbcLockRegistry.obtain(lockKey);

if (lock.tryLock(0L, TimeUnit.SECONDS)) {

    log.info("获取到锁,执行业务代码...");

} else {
    log.info("很遗憾没获取到锁。");
}

lock.unlock();

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

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

相关文章

回溯 Leetcode 37 解数独

解数独 Leetcode 37 学习记录自代码随想录 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff1a; 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。&…

如何解决机器视觉高速图像处理软件的加密需求?

高速图像处理在机器视觉中的应用重要性 在机器视觉行业中&#xff0c;高速图像处理软件的作用至关重要&#xff0c;它使得机器能够迅速分析和处理成千上万的图像数据。这种能力在制造业、安防系统、交通监控等多个领域发挥着核心作用&#xff0c;如在制造业中&#xff0c;高速…

获取PDF中的布局信息——如何获取段落

PDF解析是极其复杂的问题。不可能靠一个工具解决全部问题&#xff0c;尤其是五花八门&#xff0c;格式不统一的PDF文件。除非有钞能力。如果没有那就看看可以分为哪些问题。 提取文本内容&#xff0c;提取表格内容&#xff0c;提取图片。我认为这些应该是分开做的事情。python有…

基于大模型思维链(Chain-of-Thought)技术的定制化思维链提示和定向刺激提示的心理咨询场景定向ai智能应用

本篇为个人笔记 记录基于大模型思维链&#xff08;Chain-of-Thought&#xff09;技术的定制化思维链提示和定向刺激提示的心理咨询场景定向ai智能应用 人工智能为个人兴趣领域 业余研究 如有错漏欢迎指出&#xff01;&#xff01;&#xff01; 目录 本篇为个人笔记 记录基…

跨时钟信号处理方法

1. 背景 现在的芯片&#xff08;比如SOC&#xff0c;片上系统&#xff09;集成度和复杂度越来越高&#xff0c;通常一颗芯片上会有许多不同的信号工作在不同的时钟频率下。比如SOC芯片中的CPU通常会工作在一个频率上&#xff0c;总线信号&#xff08;比如DRAM BUS&#xff09;会…

MCBPS配置成SPI

MCBPS配置成SPI 典型的SPI接口 McBSP作为SPI主机 以McBSP为主的SPI接口如图所示。当McBSP被配置为主控器时,发送输出信号(DX)被用作SPI协议的SPISIMO信号,并且接收输入信号(DR)被用作SPISOMI信号。 表列出了将McBSP配置为主控器所需的寄存器位值。下表是有关配置要求…

性能测试-反编译jar

方法一&#xff0c;使用jd-gui 1、官网下载&#xff1a;Java Decompiler 2、下载mac版本后&#xff0c;解压&#xff0c;如下所示&#xff1a; 双击 JD_GUI&#xff0c;提示错误&#xff0c;如下所示&#xff1a; 已经安装了java 17&#xff0c;是java 1.8以上版本&#xff0…

sheng的学习笔记-卷积神经网络经典架构-LeNet-5、AlexNet、VGGNet-16

目录&#xff1a;目录 看本文章之前&#xff0c;需要学习卷积神经网络基础&#xff0c;可参考 sheng的学习笔记-卷积神经网络-CSDN博客 目录 LeNet-5 架构图 层级解析 1、输入层&#xff08;Input layer&#xff09; 2、卷积层C1&#xff08;Convolutional layer C1&…

Day06:基础入门-抓包技术HTTPS协议APP小程序PC应用WEB转发联动

目录 HTTP/HTTPS协议抓包工具 Web浏览器抓包 APP应用抓包 WX小程序&PC应用抓包 思维导图 章节知识点&#xff1a; 应用架构&#xff1a;Web/APP/云应用/三方服务/负载均衡等 安全产品&#xff1a;CDN/WAF/IDS/IPS/蜜罐/防火墙/杀毒等 渗透命令&#xff1a;文件上传下载…

FineBI与DeepBI针对用9行数据分析一篇完整的数据报告的速度对比

#数据分析报告# 在我们的理想化构想中&#xff0c;数据分析师如同诸葛亮一般&#xff0c;运筹帷幄之中&#xff0c;决策千里之外。他们似乎拥有无尽的资源&#xff0c;可以随心所欲地运用各种方法和模型。在这样的前提下&#xff0c;数据分析师理应能轻松驾驭复杂的数据&#…

备战蓝桥杯---树形DP基础3

上一次我们讲了二叉苹果树&#xff0c;现在我们加一点难度&#xff0c;从二叉变成了多叉苹果树。 这样子我们就不可以直接按照上次的方法DP&#xff0c;我们其实可以发现&#xff0c;我们可以用类似背包的思想求解&#xff0c;这就是所谓的树上背包。 我们先加进第一个儿子来…

靶机渗透之sar

Name: Sar: 1Date release: 15 Feb 2020Author: LoveSeries: Sar Download: https://drive.google.com/open?id1AFAmM21AwiAEiVFUA0cSr_GeAYaxd3lQ 对于vulnhub中的靶机&#xff0c;我们都需先下载镜像&#xff0c;然后导入VM&#xff0c;并将网络连接改为NAT模式。首先我们…

包管理工具之npm也慌了?

起因 因为npm的种种问题,我很早就换成了pnpm和yarn(但是其实npm也在使用),已经很久没有关注npm的功能更新了。最近无意间进入Node18版本的安装目录,发现其除了常规的node,npm等默认安装了一个新的包corepack,这个就是今天我要分享的东西了。 注: 我因为18版本的node上…

自动化构建平台(一)Linux下搭建私有代码仓库Gitblit的安装和使用详解

文章目录 前言一、Gitblit的安装和使用1、本地安装2、docker下安装3、Gitblit使用简介4、Gitblit仓库权限控制5、Gitblit邮件配置 总结 前言 代码版本管理&#xff0c;git模式应该是目前最流行的代码管理软件。目前支持git的管理软件有很多。 Gitblit是一个小型的代码仓库管理…

最简单的基于 FFmpeg 的推流器(以推送 RTMP 为例)

最简单的基于 FFmpeg 的推流器&#xff08;以推送 RTMP 为例&#xff09; 最简单的基于 FFmpeg 的推流器&#xff08;以推送 RTMP 为例&#xff09;简介需要注意的地方封装格式延时PTS/DTS问题 程序流程图源程序结果工程文件下载参考链接 最简单的基于 FFmpeg 的推流器&#xf…

HTML5:七天学会基础动画网页4

backgorund-size 值与说明 length(单位像素):设置背景图片高度和宽度&#xff0c;第一个值设置宽度&#xff0c;第二个值设置高度&#xff0c;如果只给出一个值&#xff0c;第二个是设置为auto。 percentage(百分比):以父元素的百分比来设置背景图像的宽度和高度&#xff0c…

ChatGPT4.0 的优势、升级 4.0 为什么这么难以及如何进行升级?

前言 “ChatGPT4.0一个月多少人民币&#xff1f;” ”chatgpt4账号“ ”chatgpt4 价格“ “chatgpt4多少钱” 最近发现很多小伙伴很想知道关于ChatGPT4.0的事情&#xff0c;于是写了这篇帖子&#xff0c;帮大家分析一下。 一、ChatGPT4.0 的优势 &#xff08;PS&#xff1a;…

SpringBoot接收参数的几种形式

SpringBoot接收参数的几种形式 在SpringBoot中获取参数基本方式有5种,需要都掌握. 这里需要记住一个技术术语或概念 API接口: 你写好的那个URL地址,就被称为API接口 1. 接收常规参数 给/param/demo1这个URL接口发送id, name两个参数 以上是以GET请求类型进行发送,实际发送…

深度学习500问——Chapter02:机器学习基础(1)

文章目录 前言 2.1 基本概念 2.1.1 大话理解机器学习本质 2.1.2 什么是神经网络 2.1.3 各种常见算法图示 2.1.4 计算图的导数计算 2.1.5 理解局部最优与全局最优 2.1.5 大数据与深度学习之间的关系 2.2 机器学习学习方式 2.2.1 监督学习 2.2.2 非监督式学习 2.2.3 …

【iOS ARKit】协作 Session 实例

协作 Session 使用注意事项 协作 Session 是在 ARWorldMap 基础上发展起来的技术&#xff0c;ARWorldMap 包含了一系列的地标、ARAnchor 及在观察这些地标和 ARAnchor 时摄像机的视场&#xff08;View&#xff09;。如果用户在某一个位置新创建了一个 ARAnchor&#xff0c;这时…