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

SpringBoot--一个注解实现Redisson分布式锁

原文网址:SpringBoot--一个注解实现Redisson分布式锁-CSDN博客

简介

本文注解组件的作用:方法上加个注解就能使用Redisson分布式锁。

为什么使用分布式锁

为了防止重复执行。以退款为例,每笔订单只能退一次款。代码逻辑:先判断数据库是否已经退款,如果还没退款则允许执行,执行结束后将退款记录到数据库内。

假设此时用户点击了两次,项目使用提交读或者重复读,在第一个请求还没执行结束时,第二个请求进来了,由于第一个请求的数据库事务还没提交,所以第二个请求还查不到第一个请求的退款记录,所以第二个请求也执行了。最终退了两次款!

解决方案就是:使用分布式锁,通过Redis来记录。如果Redis中还没有,表示还没有请求,将数据写到Redis,然后执行代码,执行结束后删除Redis数据。

本文注解支持的功能

  1. 可以指定要加锁的字段
  2. 可以指定获取锁的超时时间
  3. 可以指定获取锁失败时的提示信息
  4. 可以指定获取锁失败时抛出的异常

注意:本组件是对Redisson的封装,Redisson的分布式锁是最完美的,对它进行封装即可如虎添翼!

虽然网上有开源的了,比如:lock4j,但它有bug,执行完后不释放锁,根本没法用!

Java初级和高级的做法

Java初级开发的做法

Java初级开发者是这样使用Redisson分布式锁的:

  1. 手动加锁
  2. 将原逻辑放到获取锁成功后的代码块内
    1. 一般锁是在@Transactional之前执行,所以要将原逻辑封装到一个方法中,然后在锁获取成功后调用它
  3. 逻辑执行完后要释放锁

Java高级开发的做法

Java高级开发一眼就能看出问题了:这都是重复性的东西,提取出公共组件,让AOP去处理,原逻辑上边只加个注解即可。

效果展示

Controller

本处为了简单,直接放到了Controller上,实际应该放到Service上。

package com.knife.example.business.product.controller; import com.knife.example.business.product.bo.ProductSaveBO; import com.knife.example.business.product.bo.UserBO; import com.knife.example.common.annotation.DistributionLock; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.*; @Api(tags = "商品") @RestController @RequestMapping("product") public class ProductController { @ApiOperation("新增") @DistributionLock(keySpEL = "id+','+name") @PostMapping("add") public String add(@RequestBody ProductSaveBO productSaveBO) { try { Thread.sleep(10000); } catch (InterruptedException e) { throw new RuntimeException(e); } return "success"; } @ApiOperation("编辑") // 如果有多个类,这样写 @DistributionLock(keySpEL = "[0].id+','+[0].name") @PostMapping("edit") public String edit(@RequestBody ProductSaveBO productSaveBO, UserBO userBO) { return "success"; } }

测试

访问:http://localhost:8080/doc.html(打开两个页面)

两个页面都输入入参,点击完一个页面的“发送”后,快速点击另一个页面的“发送”,模拟并发场景。

结果

第1个页面:(获取到锁,正在执行)

第2个页面:(获取锁失败,报错)

后端结果:

等第一个页面执行结束:(执行成功,释放锁)

Redis里的数据

组件自动加锁时,往Redis里写的数据是这样的:

锁释放后,Redis这个key就没了:

代码

上边是文章的部分内容,为便于维护,全文已转移到此网址:一个注解实现Redisson分布式锁 - 自学精灵

http://www.jsqmd.com/news/1249281/

相关文章:

  • 苏州黄金回收需要实名登记吗?流程严不严 - 生活时报
  • 真力时售后服务中心全部地址及热线电话实地考察报告_多信源验证(2026年7月最新) - 亨得利官方服务中心
  • proxmox openwrt软路由 群晖折腾总结
  • 2026北京“柜姐内购价”包与专柜正价款回收价差:员工折扣入手的包,二手回收怎么算? - 日常财经早知道
  • AI自动生成会议纪要:3个被90%团队忽略的提示词陷阱,今天不改明天误事
  • 关于在VM虚拟机下,安装OpenWrt软路由,所遇错误及解决方法。
  • BERT模型在文本分类任务中的实践与优化
  • 2026江岸靠谱装修公司大盘点:从透明报价到施工质量全面对比 - 资讯纵览
  • 华中科技大学计算机组成原理实验—CPU设计实验报告
  • 2026东莞PLC培训机构客观实力排名(公开数据整理择校参考)+FAQ问答 - 互联网科技品牌测评
  • 一文吃透 OpenSSH:远程 CLI 连接、密钥免密登录、服务安全配置教程
  • 深入解析MSPM0 LCD驱动:从电压生成到多路复用的嵌入式显示技术
  • 同芯同行 信创未来—— 麒麟信安受邀参加2021信息技术应用创新高峰论坛
  • 从麦哲伦到郑和,一堂课飘洋过海 - 东方既白~(-^
  • 腾讯多模态智能鉴伪系统解析与金融应用实践
  • 2026年实测免费去水印小程序怎么选 - 免费软件工具方法教程
  • 2026重庆实木楼梯踏步楼梯栏杆定制选购指南 - LYL仔仔
  • 2026年贵阳废品回收服务盘点:金属回收与厂房拆除需求全满足 - 兔兔不是荼荼
  • 2026 翡翠行业头部玩家盘点:瑞丽市论邦珠宝店为何难以撼动榜首地位? - 互联网科技品牌测评
  • GB/T 4857.23随机振动介绍,GB/T 4857.23-2021标准及附录D谱图说明
  • 南京江诗丹顿售后服务中心|售后电话及地址权威公告(2026年7月最新) - 江诗丹顿中国服务中心
  • 软路由虚拟服务器,VMware虚拟机安装软路由(OpenWrt)详细教程
  • 数字孪生与AI技术在高安全营区智能治理中的应用
  • 当墓园开始“讲故事”,墓碑就不再只是石头
  • Qwen3.5-9B轻量化部署:GGUF量化与Ollama本地实践
  • 解决:fatal: unable to access... OpenSSL SSL_read: Connection was reset, errno 10054
  • 石家庄黄金回收禹竞|2026闲置旧金、18K金高价回收,本地正规回收门店盘点避坑指南 - 企业家观察员
  • BOOST
  • 谷歌广告投放公司推荐:外贸企业代运营收费标准与服务商选择方法 - 麦麦唛
  • 湖北武当暑期夏令营来袭!仙山习武 + 国学研学,孩子暑假好去处 - 全国文武学校招生