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

SpringBoot使用Redisson实现可重入分布式锁

pom.xml

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

application.yml

spring:redis:host: localhostport: 6379

模拟获取锁

注意下面只是示例,生产环境不要这样用

package com.example.demo.controller;import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.concurrent.TimeUnit;@Slf4j
@RestController
@RequiredArgsConstructor
public class RedissonController {private final RedissonClient redissonClient;/*** 第一次调用lock方法,会立即获取锁并持有锁30秒,30秒后释放锁,立即返回我获取到了锁* 第二次调用lock方法,立即返回我没有获取到锁*/@GetMapping("lock")public String lock() throws InterruptedException {RLock lock = redissonClient.getLock("lock");//不等待,立即获取锁。并设置持有锁的时间为30秒,到期时自动释放锁(注意:如果此时业务未执行完,也会释放锁!)boolean tryLock = lock.tryLock(0L,30, TimeUnit.SECONDS);if (tryLock) {return "我获取到了锁";}return "我没有获取到锁";}}

生产环境使用

	@GetMapping("lock")public String lock() throws InterruptedException {RLock lock = redissonClient.getLock("lock");//不等待,立即获取锁。并设置持有锁的时间为30秒,到期时自动释放锁(注意:如果此时业务未执行完,也会释放锁!根据实际来设置最长不建议超过5分钟!)boolean tryLock = lock.tryLock(0L, 300, TimeUnit.SECONDS);if (tryLock) {try {//耗时业务,不需要加锁的业务尽量不要放进来。要保证锁的粒度尽可能的小。return "我获取到了锁";} catch (Exception e) {log.error("执行业务异常",e);throw new RuntimeException(e.getMessage());} finally {//不要等锁过期自动释放,因为不释放,业务执行完还是会占用锁,所以业务执行完一定要在 finally 手动释放锁lock.unlock();}}return "我没有获取到锁";}

相关文章:

  • 如何正确理解和评估品牌价值?
  • C语言循环中获取之前变量的值
  • fataadmin导出Exel文件图片太大
  • 雷池社区版自动SSL
  • Go语言 获取服务器资源磁盘Disk情况
  • Vue3DraggableResizable知识点
  • 模型轻量化:数据瘦身的成功秘诀
  • Beyond VL了解学习
  • 【C语言】14.数组指针与函数指针及其应用
  • 智能农业管理系统设计
  • 数据标注-语音标注
  • 1台SW工作站5人同时使用能实现吗
  • Web Workers 与 DOM:异步处理与用户界面的和谐共存
  • 生命在于学习——Python人工智能原理(3.5)
  • 数据结构【二叉树】
  • [LeetCode] Wiggle Sort
  • 「译」Node.js Streams 基础
  • Android交互
  • echarts花样作死的坑
  • Git初体验
  • gulp 教程
  • Java知识点总结(JavaIO-打印流)
  • JS函数式编程 数组部分风格 ES6版
  • Python学习之路16-使用API
  • 工作中总结前端开发流程--vue项目
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 前端技术周刊 2019-02-11 Serverless
  • 前言-如何学习区块链
  • 使用 QuickBI 搭建酷炫可视化分析
  • 数组大概知多少
  • 微信小程序填坑清单
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 小程序01:wepy框架整合iview webapp UI
  • ​Linux·i2c驱动架构​
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (汇总)os模块以及shutil模块对文件的操作
  • (三)docker:Dockerfile构建容器运行jar包
  • (三)终结任务
  • (算法二)滑动窗口
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (转)mysql使用Navicat 导出和导入数据库
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • .NET建议使用的大小写命名原则
  • /usr/bin/python: can't decompress data; zlib not available 的异常处理
  • @cacheable 是否缓存成功_让我们来学习学习SpringCache分布式缓存,为什么用?
  • [17]JAVAEE-HTTP协议
  • [2]十道算法题【Java实现】
  • [BZOJ 4034][HAOI2015]T2 [树链剖分]
  • [CISCN 2023 初赛]go_session
  • [codevs 1288] 埃及分数 [IDdfs 迭代加深搜索 ]
  • [corCTF 2022] CoRJail: From Null Byte Overflow To Docker Escape
  • [CSS]文字旁边的竖线以及布局知识
  • [flask] flask的基本介绍、flask快速搭建项目并运行