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

Spring Boot + Redisson 封装分布式锁

目标:一行代码调用,简单粗暴。
基操:自动加锁,自动解锁,自动处理异常,自动处理锁超时等。

安装

redis + redisson

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.39.0</version></dependency>

hutool 工具类

        <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version></dependency>

配置

spring:data:redis:host: xxxport: 6379password: xxxdatabase: x

配置类

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;/*** 方便获取 Spring IOC 实例** @author jason*/
@Configuration
@Import(cn.hutool.extra.spring.SpringUtil.class)
public class BeanConf {
}

工具类

import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.spring.SpringUtil;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import java.util.concurrent.TimeUnit;
import java.util.function.Supplier;/*** Redisson 操作工具类** @author jason*/
@Slf4j
@Component
public class RedissonUtil {/*** 锁默认超时时间为(单位:秒)*/private static final long LEASE_TIME = 10;@Autowiredprivate RedissonClient redissonClient;public static RedissonUtil instance() {return SpringUtil.getBean(RedissonUtil.class);}/*** 获取可重入锁* <p>* 读写锁(RReadWriteLock)包括读锁和写锁两部分:* 读锁(Read Lock):允许多个读线程同时访问,但写线程会被阻塞。* 写锁(Write Lock):独占锁,保证同时只有一个写线程访问,同时也会阻塞其他读线程。*/public static RLock getClint(String key) {return instance().redissonClient.getLock(key);}/*** 加锁*/public static void lock(String key) {getClint(key).lock(LEASE_TIME, TimeUnit.SECONDS);}/*** 解锁*/public static void unLock(String key) {if (getClint(key).isLocked()) {getClint(key).unlock();}}/*** 分布式锁,默认超时时间为 LEASE_TIME*/public static <T> T lock(String lockKey, Supplier<T> supplier) {lockKey = "distributed:" + lockKey;log.info("加锁开始,线程:{}", ThreadUtil.currentThreadGroup().getName());RedissonUtil.lock(lockKey);log.info("加锁结束,线程:{}", ThreadUtil.currentThreadGroup().getName());try {log.info("执行代码块开始,线程:{}", ThreadUtil.currentThreadGroup().getName());T t = supplier.get();log.info("执行代码块结束,线程:{}", ThreadUtil.currentThreadGroup().getName());return t;} catch (Exception e) {log.error(StrUtil.format("执行异常,线程:{}", ThreadUtil.currentThreadGroup().getName()), e);} finally {RedissonUtil.unLock(lockKey);log.info("释放锁结束,线程:{}", ThreadUtil.currentThreadGroup().getName());}return null;}}

测试

    @GetMapping("/lock/{key}")public String lock(@PathVariable String key) {return RedissonUtil.lock(key, () -> {ThreadUtil.sleep(30 * 1000);return "出参";});}
2024-12-26T11:07:41.307 xxx.util.RedissonUtil    : 加锁开始,线程:main
2024-12-26T11:07:41.315 xxx.util.RedissonUtil    : 加锁结束,线程:main
2024-12-26T11:07:41.315 xxx.util.RedissonUtil    : 执行代码块开始,线程:main
2024-12-26T11:08:11.323 xxx.util.RedissonUtil    : 执行代码块结束,线程:main
2024-12-26T11:08:11.338 xxx.util.RedissonUtil    : 释放锁结束,线程:main

源码

https://gitee.com/zhaomingjian/workspace_jason_demo/tree/master/spring-boot-seckill

相关文章:

Spring Boot + Redisson 封装分布式锁

目标&#xff1a;一行代码调用&#xff0c;简单粗暴。 基操&#xff1a;自动加锁&#xff0c;自动解锁&#xff0c;自动处理异常&#xff0c;自动处理锁超时等。 安装 redis redisson <dependency><groupId>org.springframework.boot</groupId><artifac…...

QWEN2 模型架构配置;GGUF的概念:实现量化存储

Qwen2不同配置的模型,其头数量和MLP大小有所不同,以下是具体信息 : Qwen2-0.5B:query heads数量为14,head size为64,intermediate size(即MLP)为4864。Qwen2-1.5B:query heads数量为12,head size为128,intermediate size为8960 。Qwen2-7B:query heads数量为28,he…...

window如何将powershell以管理员身份添加到右键菜单?(按住Shift键显示)

window如何将powershell以管理员身份添加到右键菜单&#xff1f; 在 Windows 中&#xff0c;将 PowerShell 以管理员身份添加到右键菜单&#xff0c;可以让你在需要提升权限的情况下快速打开 PowerShell 窗口。以下是详细的步骤&#xff0c;包括手动编辑注册表和使用注册表脚本…...

spring中使用@Validated,什么是JSR 303数据校验,spring boot中怎么使用数据校验

文章目录 一、JSR 303后台数据校验1.1 什么是 JSR303&#xff1f;1.2 为什么使用 JSR 303&#xff1f; 二、Spring Boot 中使用数据校验2.1 基本注解校验2.1.1 使用步骤2.1.2 举例Valid注解全局统一异常处理 2.2 分组校验2.2.1 使用步骤2.2.2 举例Validated注解Validated和Vali…...

实际部署Dify可能遇到的问题:忘记密码、开启HTTPS、知识库文档上传的大小限制和数量限制

背景 前面我们以 docker compose 容器化的方式本地部署了 Dify 社区版&#xff0c;并快速体验了其聊天助手、工作量编排以及智能体&#xff08;Agent&#xff09;功能。不过后续实际生产环境使用时遇到了忘记密码、如何开启SSL以支持HTTPS、如何突破知识库文档上传的大小限制和…...

mugen

title: 走进 Mugen&#xff1a;性能测试领域的得力助手 date: ‘2024-12-30’ category: blog tags: Mugen性能测试开源项目系统评估 sig: QA archives: ‘2024-12’ author:way_back summary: Mugen 作为一款优秀的性能测试工具&#xff0c;以其丰富的功能、灵活的配置和精准…...

CannotRetrieveUpdates alert in disconnected OCP 4 cluster解决

环境&#xff1a; Red Hat OpenShift Container Platform (RHOCP) 4 问题&#xff1a; Cluster Version Operator 不断发送警报&#xff0c;表示在受限网络/断开连接的 OCP 4 集群中无法接收更新。 在隔离的 OpenShift 4 集群中看到 CannotRetrieveUpdates 警报&#xff1a; …...

计算机网络 (16)数字链路层的几个共同问题

一、封装成帧 封装成帧是数据链路层的一个基本问题。数据链路层把网络层交下来的数据构成帧发送到链路上&#xff0c;以及把接收到的帧中的数据取出并上交给网络层。封装成帧就是在一段数据的前后分别添加首部和尾部&#xff0c;构成了一个帧。接收端在收到物理层上交的比特流后…...

细说STM32F407单片机通过IIC读写EEPROM 24C02

目录 一、操作说明 二、工程配置 1、时钟、DEBUG、GPIO、USART6、NVIC、Code Generator 2、 IIC2 &#xff08;1&#xff09;Master Features组&#xff0c;主设备参数 &#xff08;2&#xff09;Slave Features组&#xff0c;从设备参数 三、软件设计 1、KELED 2、E…...

【AimRT】现代机器人通信中间件 AimRT

目录 一、什么是AimRT二、AimRT与ROS22.1 定位与设计2.2 组成与通信方式对比 三、AimRT基本概念3.1 Node、Pkg 和 Module3.2 Protocol、Channel、Rpc 和 Filter3.3 App模式 和 Pkg模式3.4 Executor3.5 Plugin 一、什么是AimRT AimRT 是智元机器人公司自主研发的一款机器人通信…...

Unity 读Excel,读取xlsx文件解决方案

Unity读取表格数据 效果&#xff1a; 思路&#xff1a; Unity可以解析Json&#xff0c;但是读取Excel需要插件的帮助&#xff0c;那就把这个功能分离开&#xff0c;读表插件就只管读表转Json&#xff0c;Unity就只管Json解析&#xff0c;中间需要一个存储空间&#xff0c;使用…...

R基于贝叶斯加法回归树BART、MCMC的DLNM分布滞后非线性模型分析母婴PM2.5暴露与出生体重数据及GAM模型对比、关键窗口识别

全文链接&#xff1a;https://tecdat.cn/?p38667 摘要&#xff1a;在母婴暴露于空气污染对儿童健康影响的研究中&#xff0c;常需对孕期暴露情况与健康结果进行回归分析。分布滞后非线性模型&#xff08;DLNM&#xff09;是一种常用于估计暴露 - 时间 - 响应函数的统计方法&am…...

【信息系统项目管理师】高分论文:论信息系统项目的沟通管理(信息管理服务一体化平台)

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论文一、事预则立,规划沟通管理二、提升支持,管理沟通三、观察偏差,监督沟通论文 2022年2月,我公司承建某省退役军人信息管理服务一体化平台项目,由于本人具有较丰富的项目管理经验,同时也是一名退伍军人…...

物联网工厂可视化监控平台:为智能制造打造的可视化大屏

01行业背景 随着技术的不断进步&#xff0c;物联网&#xff08;IoT&#xff09;已经成为推动数字化转型的核心力量。物联网通过连接各种设备和传感器&#xff0c;实现数据的实时收集、传输和分析&#xff0c;为各行各业带来了革命性的变化。随着5G、云计算、大数据等技术的成熟…...

3、redis的高可用

主从复制 主从复制&#xff1a;这是redis高可用的基础。哨兵模式和集群都是建立在此基础之上。 主从模式和数据库的主从模式是一样的&#xff0c;主负责写入&#xff0c;然后把写入的数据同步到从&#xff0c;从节点只能读不能写。read only。 不能做高可用的切换&#xff…...

数据结构--顺序表(详解)

欢迎大家来到我的博客~欢迎大家对我的博客提出指导&#xff0c;有错误的地方会改进的哦~点击这里了解更多内容 目录 一、线性表二、顺序表 一、线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结…...

Day62 图论part11

Floyd 算法精讲 Floyd 算法代码很简单&#xff0c;但真正理解起原理 还是需要花点功夫&#xff0c;大家在看代码的时候&#xff0c;会发现 Floyd 的代码很简单&#xff0c;甚至看一眼就背下来了&#xff0c;但我为了讲清楚原理&#xff0c;本篇还是花了大篇幅来讲解。 代码随想…...

git clone 超时

git clone 超时 参考 https://blog.csdn.net/qq_45906972/article/details/142214187?utm_mediumdistribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-142214187-blog-137158358.235v43pc_blog_bottom_relevance_base8&spm1001.2101.3001.…...

WPF编程excel表格操作

WPF编程excel表格操作 摘要NPOI安装封装代码测试代码 摘要 Excel操作几种方式 使用开源库NPOI(常用&#xff0c;操作丰富)使用Microsoft.Office.Interop.Excel COM组件(兼容性问题)使用OpenXml(效率高)使用OleDb(过时) NPOI安装 封装代码 using System; using System.IO; u…...

Day10补代码随想录 理论基础|232.用栈实现队列|225.用队列实现栈|20.有效的括号|1047.删除字符串中的所有相邻重复项

栈和队列理论基础 抽象认识 栈是先进后出(FIFO)&#xff0c;队列是先进先出(LIFO) 队首(先进))队尾(后进)栈顶(后进)栈底(先进) 栈(Stack) 只在一端进行进出操作(只在一端进一端出)像个篮球框&#xff0c;取用篮球从一端进出。 /进栈 int a[1000];//足够大的栈空间 int top-1…...

EEG数据处理全攻略:从EDF文件读取到.set文件保存的完整MATLAB代码示例

EEG数据处理全攻略&#xff1a;从EDF文件读取到.set文件保存的完整MATLAB代码示例 在神经科学研究中&#xff0c;脑电图(EEG)数据的处理是基础且关键的一环。对于使用MATLAB进行EEG数据分析的研究人员来说&#xff0c;从原始EDF文件读取到最终保存为.set格式的完整流程&#xf…...

开源PLC编程全指南:从入门到实战的工业控制开发详解

开源PLC编程全指南&#xff1a;从入门到实战的工业控制开发详解 【免费下载链接】OpenPLC_Editor 项目地址: https://gitcode.com/gh_mirrors/ope/OpenPLC_Editor 在工业自动化领域&#xff0c;开源技术正逐步打破传统PLC&#xff08;可编程逻辑控制器&#xff09;的封…...

小白友好:MinerU 2.5-1.2B镜像快速部署与常见问题解决

小白友好&#xff1a;MinerU 2.5-1.2B镜像快速部署与常见问题解决 1. 前言&#xff1a;为什么选择MinerU镜像&#xff1f; 在日常工作中&#xff0c;我们经常需要处理各种PDF文档——从技术手册到学术论文&#xff0c;从财务报表到产品说明书。但将这些PDF转换为可编辑的Mark…...

过炉治具使用寿命钛合金解决方案

过炉治具的使用寿命&#xff0c;是波峰焊工艺中影响成本和生产效率的关键。选择钛合金&#xff0c;正是因为它能从根本上解决治具因高温、磨损、腐蚀而导致的寿命短板。综合来看&#xff0c;钛合金是延长治具寿命的最高效方案。对于追求极致稳定性的生产&#xff0c;特别是大批…...

seo收录查询工具如何提高网站的关键词排名

SEO收录查询工具如何提高网站的关键词排名 在当前竞争激烈的互联网环境中&#xff0c;网站的SEO排名直接影响到网站的流量和收入。而关键词排名作为SEO的重要组成部分&#xff0c;如何通过SEO收录查询工具提高网站的关键词排名&#xff0c;是每一个网站运营者都需要关注的问题…...

基于IMS轴承数据的实战:5步搭建你的第一个LSTM故障预警模型(TensorFlow/PyTorch)

基于IMS轴承数据的实战&#xff1a;5步搭建你的第一个LSTM故障预警模型&#xff08;TensorFlow/PyTorch&#xff09; 轴承作为工业设备的核心部件&#xff0c;其健康状态直接影响生产线的稳定运行。传统的人工巡检和定期维护方式已无法满足现代工业对效率和成本的要求。预测性维…...

seo快速优化软件使用教程_seo快速优化软件有哪些特点

SEO快速优化软件使用教程&#xff1a;SEO快速优化软件有哪些特点 在当今数字化时代&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;已成为网站提升流量、提高曝光度的关键手段。而在SEO领域&#xff0c;使用SEO快速优化软件可以大大提高效率&#xff0c;让你在短时间内看…...

C++ 安全删除协议:在 C++ 关键对象析构时利用强制指令清空内存敏感数据以防御物理内存读取

C 安全删除协议&#xff1a;在关键对象析构时利用强制指令清空内存敏感数据以防御物理内存读取内存残留的无声威胁&#xff1a;数字世界中的物理漏洞在现代软件开发中&#xff0c;我们通常将注意力集中在网络安全、代码漏洞和逻辑错误上。然而&#xff0c;即便应用程序看似安全…...

mdp与GitHub Flavored Markdown兼容性深度解析:终极完整指南

mdp与GitHub Flavored Markdown兼容性深度解析&#xff1a;终极完整指南 【免费下载链接】mdp A command-line based markdown presentation tool. 项目地址: https://gitcode.com/gh_mirrors/md/mdp mdp是一款基于命令行的markdown演示工具&#xff0c;它为用户提供了在…...

链表(两数相加)(1)

一.题目 2. 两数相加 - 力扣&#xff08;LeetCode&#xff09; 二.思路讲解 2.1 审题 题目给出两个非空链表&#xff0c;每个链表表示一个非负整数&#xff0c;并且数字是逆序存储的&#xff0c;即链表的头节点对应数字的最低位。例如&#xff0c;链表 2->4->3 表示数字…...