当前位置: 首页 > 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

http://www.lryc.cn/news/512373.html

相关文章:

  • QWEN2 模型架构配置;GGUF的概念:实现量化存储
  • window如何将powershell以管理员身份添加到右键菜单?(按住Shift键显示)
  • spring中使用@Validated,什么是JSR 303数据校验,spring boot中怎么使用数据校验
  • 实际部署Dify可能遇到的问题:忘记密码、开启HTTPS、知识库文档上传的大小限制和数量限制
  • mugen
  • CannotRetrieveUpdates alert in disconnected OCP 4 cluster解决
  • 计算机网络 (16)数字链路层的几个共同问题
  • 细说STM32F407单片机通过IIC读写EEPROM 24C02
  • 【AimRT】现代机器人通信中间件 AimRT
  • Unity 读Excel,读取xlsx文件解决方案
  • R基于贝叶斯加法回归树BART、MCMC的DLNM分布滞后非线性模型分析母婴PM2.5暴露与出生体重数据及GAM模型对比、关键窗口识别
  • 【信息系统项目管理师】高分论文:论信息系统项目的沟通管理(信息管理服务一体化平台)
  • 物联网工厂可视化监控平台:为智能制造打造的可视化大屏
  • 3、redis的高可用
  • 数据结构--顺序表(详解)
  • Day62 图论part11
  • git clone 超时
  • WPF编程excel表格操作
  • Day10补代码随想录 理论基础|232.用栈实现队列|225.用队列实现栈|20.有效的括号|1047.删除字符串中的所有相邻重复项
  • 【Devops】什么是Devops?(Development+Operations)和运维的区别?
  • 基于NodeMCU的物联网电灯控制系统设计
  • Linux驱动开发 IIC I2C驱动 编写APP访问EEPROM AT24C02
  • Linux应用软件编程-多任务处理(线程)
  • VITUREMEIG | AR眼镜 算力增程
  • Jenkins管理多版本python环境
  • Flutter富文本实现学习
  • 如何解决 OpenAI API 连接问题:降级 urllib3 版本
  • 【C语言】库函数常见的陷阱与缺陷(三):内存分配函数[4]--free
  • 论文分享 | PromptFuzz:用于模糊测试驱动程序生成的提示模糊测试
  • AWS K8s 部署架构