Spring Boot 3 整合 Redisson 实现分布式锁

Spring Boot 3 整合 Redisson 实现分布式锁

这篇博客详细介绍了如何在 Spring Boot 3 项目中使用 Redisson 实现分布式锁,包括依赖引入、Redis 配置、Redisson 配置、实现锁服务,以及测试控制器。希望对你有帮助!

介绍

在分布式系统中,多个服务实例可能会同时访问共享资源,导致数据不一致或竞争条件。使用分布式锁可以有效地解决这些问题。本文将介绍如何在 Spring Boot 3 项目中整合 Redisson 以实现分布式锁。

前提条件

  • Java Development Kit (JDK) 17 或更高版本
  • Maven 构建工具
  • Redis 服务器

引入依赖

首先,在你的 pom.xml 文件中引入 Redisson 的依赖:

<dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.18.0</version>
</dependency>

配置 Redis

application.yml 文件中配置 Redis 的连接信息:

spring:data:redis:database: 0host: 127.0.0.1port: 6379password: 123456  # 如果没有密码,可以去掉这一行 去掉这一行

创建 RedisLockService 类

创建一个 RedisLockService 类来管理分布式锁的获取和释放:

import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.concurrent.TimeUnit;@Service
public class RedisLockService {@Autowiredprivate RedissonClient redissonClient;/*** 获取锁的方法* @param lockKey 锁键* @param waitTime 等待时间* @param leaseTime 租约时间* @return 是否获取到锁*/public boolean acquireLock(String lockKey, long waitTime, long leaseTime) {// 获取指定锁键对应的 Redisson 锁RLock lock = redissonClient.getLock(lockKey);try {// 尝试以指定等待时间和租约时间获取锁return lock.tryLock(waitTime, leaseTime, TimeUnit.SECONDS);} catch (InterruptedException e) {// 当前线程中断Thread.currentThread().interrupt();// 返回获取锁失败return false;}}/*** 释放锁的方法* @param lockKey 锁键*/public void releaseLock(String lockKey) {// 获取指定锁键对应的 Redisson 锁RLock lock = redissonClient.getLock(lockKey);// 如果当前线程持有该锁if (lock.isHeldByCurrentThread()) {// 释放锁lock.unlock();}}}

创建控制器

创建一个控制器来测试分布式锁的功能:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class LockController {@Autowiredprivate RedisLockService redisLockService;@GetMapping("/doSomething")public String doSomething() {String lockKey = "myLock";boolean isLockAcquired = redisLockService.acquireLock(lockKey, 5, 10);if (isLockAcquired) {try {System.out.println("获取到锁!");// 在这里执行你的业务逻辑Thread.sleep(5000); // 模拟业务处理时间return "业务处理完成";} catch (InterruptedException e) {Thread.currentThread().interrupt();return "业务处理失败";} finally {redisLockService.releaseLock(lockKey);System.out.println("锁已释放!");}} else {System.out.println("未能获取到锁!");return "业务处理失败";}}
}

运行应用

启动 Spring Boot 应用程序并访问 http://localhost:8080/doSomething,你应该会看到获取和释放锁的相关日志输出。

结论

通过上述步骤,我们成功地在 Spring Boot 3 项目中整合了 Redisson,实现了分布式锁的功能。Redisson 提供了强大且易于使用的 API,使得在分布式环境下实现锁机制变得简单且高效。

希望这篇文章对你有所帮助!如有任何问题或建议,欢迎讨论!

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

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

相关文章

Spring boot 单元测试类

在Spring Boot中&#xff0c;我们可以使用Spring Boot Test框架来进行单元测试。这是一个非常强大的工具&#xff0c;可以帮助我们模拟Spring环境&#xff0c;进行各种测试&#xff0c;如集成测试、容器测试等。 以下是一些Spring Boot 单元测试的示例。 基本的Spring Boot测…

【2024最新精简版】线程安全/多线程 面试篇

文章目录 一. 线程基础线程和进程什么是进程什么是线程 并发与并行的区别创建线程继承Thread类实现Runable接口实现Callable接口使用线程池 线程状态等待唤醒机制等待方法唤醒方法 二. 线程池线程池作用创建线程池线程池任务调度流程阻塞队列 BlockingQueue线程池拒绝策略核心线…

只有程序员才能看懂的笑话

哈喽&#xff0c;大家好&#xff0c;我是明智 今天又是周五摸鱼日&#xff5e; 咱们不聊技术&#xff0c;看点别的有意思的东西 往期摸鱼记录&#xff1a; 》》》程序员的那些经典段子 》》》写出bug不用怕&#xff0c;世界就是一个巨大的草台班子 【1】二进制 世界上有10种人&…

三维渲染计算阴影

在三维渲染中&#xff0c;计算阴影是提升场景真实感的关键步骤。阴影不仅提供了物体间的相对位置和空间关系&#xff0c;还增强了场景的立体感和深度感。计算阴影的方法多种多样&#xff0c;以下是几种主要的阴影计算技术及其实现原理。 1. 阴影映射&#xff08;Shadow Mappin…

随机链表的复制 排序链表

随机链表的复制 题目 . - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 思路&#xff1a; ①一个结点一个节点去拷贝&#xff0c;当拷贝了第一个节点的时候&#xff0c;把原节点与拷贝节点连接起来&#xff0c;直接到所有的节点拷贝完毕&#xff0c;这样做的目的…

专业技能篇---计算机网络

文章目录 前言计算机网络基础一、网络分层模型 HTTP一、从输入URL到页面显示发生了什么&#xff1f;二、Http的状态码有哪些&#xff1f;三、 HTTP与HTTPS有什么区别&#xff1f;四、URI 和 URL 的区别是什么?五、Cookie和Session有什么区别&#xff1f;六、GET与POST WebSock…

Android自定义View之不得不知道的文件attrs

其中demo_style如下:一般都是放的.9图片&#xff0c;为了方便就放个颜色了 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190820183209784.png?x-oss-processimage/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLm NzZG4ubmV0L3FxXzQyNzYxMz…

怎么判断文件 fileoutPutStream已经拷贝成功? 项目需求是判断fileInputStream已经拷贝

要判断文件 fileoutPutStream 已经拷贝成功&#xff0c;可以通过以下几个步骤来实现&#xff1a; 1. **确保所有数据都已写入**: 使用 FileOutputStream 的 getFD().sync() 方法&#xff0c;这会强制将所有未写的数据写入到磁盘上。 2. **检查流是否关闭成功**: 在关闭…

一文讲解什么是内容可寻址寄存器(Content-Addressable Register)

内容可寻址寄存器&#xff08;Content-Addressable Register&#xff0c;CAR&#xff09;是一种根据内容而非地址来存取数据的存储单元。这种寄存器可以通过指定的数据值来查找对应的存储位置&#xff0c;显著提高了数据匹配和检索的效率&#xff0c;尤其适用于需要快速数据查找…

MLX5_SET_TO_ONES宏解析

看代码时&#xff0c;遇到一个非常复杂的宏MLX5_SET_TO_ONES&#xff0c;这个宏的主要作用是对特定的数据结构置位&#xff0c;宏的上下文如下&#xff1a; #define __mlx5_nullp(typ) ((struct mlx5_ifc_##typ##_bits *)0) #define __mlx5_bit_off(typ, fld) (offsetof(struc…

[程序员] 表达的能力

之前看CSDN的问答区&#xff0c;很多时候&#xff0c;感觉问题的描述所要表达的意思非常模糊&#xff0c;或者说描述不清。如果是想回答问题的人想回答问题&#xff0c;首先要搞清楚是什么问题&#xff0c;就需要再问问题主很多细节的东西。三来四去&#xff0c;才能搞清楚具体…

C++ 代码实现鼠标右键注册菜单,一级目录和二级目录方法

最近做的一个项目, 在使用windows的时候,我希望在右键菜单中添加一个自定义的选项, 该选项下有我经常使用的多个程序快捷方式, 直接上代码 头文件 #pragma once #include <Windows.h> #include <iostream> #include <string> using namespace std; …

面向服务的架构(Service-Oriented Architecture, SOA)

目录 前言1. SOA的基本概念1.1 定义和特点1.2 核心原则 2. SOA的优势与挑战2.1 优势2.2 挑战 3. SOA的实现技术3.1 Web服务3.2 微服务架构3.3 企业服务总线&#xff08;ESB&#xff09; 4. SOA在现代企业中的应用4.1 金融行业4.2 电子商务4.3 政府和公共服务4.4 医疗健康 结语 …

EE trade:炒伦敦金的注意事项及交易指南

在贵金属市场中&#xff0c;伦敦金因其高流动性和全球认可度&#xff0c;成为广大投资者的首选。然而&#xff0c;在炒伦敦金的过程中&#xff0c;投资者需要注意一些关键点。南华金业小编带您一起来看看。 国际黄金报价 一般国际黄金报价会提供三个价格&#xff1a; 买价(B…

LeetCode 1-两数之和

LeetCode第1题 两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现…

力扣SQL50 各赛事的用户注册率 分组计数 双排序字段

Problem: 1633. 各赛事的用户注册率 &#x1f468;‍&#x1f3eb; 参考题解 Code select contest_id, ROUND(COUNT(user_id) * 100 / (select count(*) from users),2) as percentage from register group by contest_id order by percentage desc, contest_id asc

vue3自动导入---组件库elements-ui,vuetify以及scss样式的自动导入

自动导入 我们在使用第三方组件库和css样式文件时&#xff0c;都需要进行引入&#xff0c;可以在单个组件内单独引用&#xff0c;也可以在全局引入或一次引入所有组件&#xff1b;但是&#xff0c;一般情况下我们都不会全部引入&#xff0c;这会是打包的结果变大&#xff0c;而…

linux挂载硬盘(解决linux不显示硬盘问题)

目录 1.查看系统有几块硬盘2.查看挂载情况3.格式化硬盘4.创建挂载目录用于挂载硬盘5.将硬盘挂载到指定的挂载目录6.随系统自启动挂载查看配置文件&#xff0c;看是否已经把这条命令加入配置 帮同门解决挂载失败问题记录 参考视频&#xff1a;只要6步&#xff01;Linux系统下挂载…

人工智能在影像组学与放射组学中的最新进展|顶刊速递·24-06-22

小罗碎碎念 本期文献速递的主题——人工智能在影像组学中的最新进展。 小罗一直以来的观点&#xff0c;是把大问题分模块拆解——既然我们想做多模态&#xff0c;那么就先了解单模态的研究套路&#xff0c;再去研究不同模态提取的特征如何融合&#xff0c;搞科研的过程也是管理…

获取泛型,泛型擦除,TypeReference 原理分析

说明 author blog.jellyfishmix.com / JellyfishMIX - githubLICENSE GPL-2.0 获取泛型&#xff0c;泛型擦除 下图中示例代码是一个工具类用于生成 csv 文件&#xff0c;需要拿到数据的类型&#xff0c;使用反射感知数据类型的字段&#xff0c;来填充表字段名。可以看到泛型…