我开发了一款只用一个注解就实现分布式锁的工具框架

news2024/11/27 22:35:15

相信大家在JAVA中知道锁的一个概念。在JAVA中,锁是一种机制,用于控制并发代码的执行。锁用于保护共享资源的访问,确保只有一个线程能够同时访问这些资源。锁可以防止多个线程同时执行对共享资源的修改操作,从而避免数据不一致或竞争条件。

但是呢JAVA里面的锁都是基于jvm的。就是说是一个服务独有的。这样的话,在分布式框架中就会有一个问题。比如说我有三个节点。大量的请求进来。我们的需求是不管你请求多少次,只会执行一次。假如说三个节点中每一个节点都进来了一个请求,这样的话就会出现执行了三次请求。这个时候就要请我们的分布式锁出场了。

分布式锁是一种用于在分布式系统中协调多个进程或节点访问共享资源的机制。它可以确保在多个节点上的操作不会发生冲突,避免数据不一致性和竞态条件问题。所以呢我就开发了一个只通过一个注解实现这个功能的工具框架(simple-cache)。

这次V1.4.0主要更新的内容为:

  • RedisLock注解实现分布锁

simple-cache-spring-boot-starter

在这里插入图片描述

请使用1.4.2版本

	    <dependency>
            <groupId>io.gitee.antopen</groupId>
            <artifactId>simple-cache-spring-boot-starter</artifactId>
            <version>1.4.2</version>
        </dependency>

准备条件在博主的上一篇文章上门已经讲的很详细了,这次就不做讲解,只讲新功能

【simple-cache】一款只用一个注解就实现缓存的框架-我们终于迎来了SpringBoot版本

直接在bean类中添加@RedisLock注解即可。

说明:

@RedisLock可选值

属性类型必须指定默认值描述
valuestring分布式锁的名称,可以自定义
expirelong10L(10秒)锁超时时间,锁自动释放
unitTimeUnitTimeUnit.SECONDS(一秒)时间单位。默认为秒。,可以修改
delWhenTaskCompletebooleantrue任务执行完是否释放,可以修改
tipsboolean该任务正在执行,请稍后再试有锁时返回的提示,可以修改

只有value属性的时候

只有value属性的时候当访问该方法的时候,redis里面会有一个叫testRLock的锁,默认过期时间为10s

    @RedisLock(value = "testRLock")
    public String testRLock() {
        System.out.println("hello testRLock");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        return "进入方法了";
    }

在这里插入图片描述

由于上面我们模拟了这个方法的执行时间为5秒钟,而且我们的delWhenTaskComplete默认值是true,所以没等10秒中过去,任务已经执行完并且自己释放锁了。如果我们在5秒内,也就是说锁还在的时候再次请求这个接口(方法),就会返回tips里面的提示:

在这里插入图片描述

expire值

    @RedisLock(value = "testRLock",expire = 60L)
    public String testRLockexpire() {
        System.out.println("hello testRLock");
        try {
            Thread.sleep(500000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        return "进入方法了";
    }

expire值默认是10s,大家可以根据自己项目实际情况去设置秒数,如上是会生成一个60s的锁。

在这里插入图片描述

unit值

  @RedisLock(value = "testRLock", expire = 1L, unit = TimeUnit.HOURS)
    public String testRLockexpireAndunit() {
        System.out.println("hello testRLock");
        try {
            Thread.sleep(50000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        return "进入方法了";
    }

unit值可以和expire 值结合使用,如上就是会生成一个小时的锁。

在这里插入图片描述

delWhenTaskComplete值

   @RedisLock(value = "testRLock", delWhenTaskComplete = false)
    public String testRLockdelWhenTaskComplete() {
        System.out.println("hello testRLock");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        return "进入方法了";
    }

delWhenTaskComplete默认是true,意思就是不管你锁的过期时间是多少,我任务执行完之后就会释放自己的锁,但是我们可以把他关闭,那么他就不会释放锁了,必须等到锁过期才能自动释放锁。建议大家在设置该值的时候按照实际业务调整和过期时间的设定,建议锁的过期时间要大于业务执行的时间,如果小于执行时间的话,锁就会优先过期掉了。

tips 值

  @RedisLock(value = "testRLockTips", tips = "别急,等下再试!!")
    public String testRLockTips() {
        System.out.println("hello testRLock");
        try {
            Thread.sleep(50000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        return "进入方法了";
    }

tips 是提示,大家可以自定义提示,例如上面的别急,等下再试!!

在这里插入图片描述

EL表达式

    /**
     * 测试分布式锁
     *
     * @return string
     */
    @GetMapping("/testRLockId")
    public Object testRLockId() {

        return testRLockService.testRLockId(1);
    }

  @RedisLock(value = "#id")
    public String testRLockId(Integer id) {
        System.out.println("hello testRLock");
        try {
            Thread.sleep(50000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        return "进入方法了";
    }

同样,这个注解支持EL表达式,只要以#开头,值和入参名字一样即可,可参考上面的代码实现,上面就是把1作为唯一id作为锁的名称。

在这里插入图片描述

完整代码已经开源:

Simple Cache Spring Boot Starter

Simple Cache Spring Boot 快速启动代码

后续版本考虑:

  • 添加RedisCount注解,添加计数功能,例如网页访问量

如果有建议欢迎提出

如果你也想为开源贡献自己的力量,欢迎加入蚂蚁开源

在这里插入图片描述

使用simple-cache的springboot版本也十分简单,只需要:

  1. 引入simple-cache-spring-boot-starter依赖;
  2. 在启动类加上EnableSimpleCache注解;
  3. 在配置文件中填写属于你自己项目的redistemplate的bean的名称;
  4. 在你的业务类方法上添加simple-cache的注解

在这里插入图片描述

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

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

相关文章

探讨在大数据体系中API的通信机制与工作原理

** 引言 关联阅读博客文章&#xff1a;深入解析大数据体系中的ETL工作原理及常见组件 关联阅读博客文章&#xff1a;深入理解HDFS工作原理&#xff1a;大数据存储和容错性机制解析 ** 在当今数字化时代&#xff0c;数据已经成为企业发展和决策的核心。随着数据规模的不断增长…

zabbix_yum安装

目录 一.配置zabbix的yum源 二.安装zabbix server 三.安装zabbix agent 四.安装zabbix web界面 五.安装数据库 六.配置数据库 七.为zabbix server配置数据库 八.启动服务,web界面安装 九.遇到php版本过低问题 前置条件:基于Rocky Linux8操作系统配置的&#xff0c;建议…

Oracle19c ADG搭建

文章目录 一、环境配置1、主机环境2、host文件配置 二、主库配置1、 开启归档2、redo日志3、修改参数文件4、配置TNS文件5、静态监听6、拷贝密码文件 三、备库配置1、开启归档2、redo日志3、修改参数文件4、配置TNS文件5、配置静态监听 四、构建DG1、验证监听2、主库登入rman&a…

【计算机考研】408全年保姆级规划+资料分享

408的复习顺序其实没有标准&#xff0c;推荐先复习数据结构 复习完数据结构之后&#xff0c;再去学操作系统和计算机网络的一些知识点就会很好理解。 数据结构➡计算机组成原理➡操作系统➡计算机网络。 大家可以按照上面这个顺序来学&#xff0c;其实按照这个顺序来学也是因…

泛零售行业大会员经营的发展趋势?

​随着消费者需求的快速变化和技术的不断进步&#xff0c;泛零售行业大会员经营将呈现如下发展趋势: 第一&#xff0c;会员精细化运营和个性服务将上升为泛零售企业未来的战略重点之一。 存量时代&#xff0c;市场竞争加剧&#xff0c;对绝大多数泛零售企业来说&#xff0c;得…

2024三掌柜赠书活动第二十期:搜索之道:信息素养与终身学习的新引擎

目录 目录 前言 信息素养 终身学习 搜索引擎 信息素养与终身学习 关于《搜索之道&#xff1a;信息素养与终身学习的新引擎》 编辑推荐 内容简介 作者简介 图书目录 书中前言/序言 《搜索之道&#xff1a;信息素养与终身学习的新引擎》全书速览 结束语 前言 随着互…

密码算法概论

基本概念 什么是密码学&#xff1f; 简单来说&#xff0c;密码学就是研究编制密码和破译密码的技术科学 例题&#xff1a; 密码学的三个阶段 古代到1949年&#xff1a;具有艺术性的科学1949到1975年&#xff1a;IBM制定了加密标准DES1976至今&#xff1a;1976年开创了公钥密…

微服务之分布式事务概念

微服务之分布式事务概念 CAP定理和Base理论 CAP定理 CAP定理在1998年被加州大学的计算机科学家 Eric Brewer 提出&#xff0c;分布式系统有三个指标&#xff1a; 一致性&#xff08;Consistency&#xff09;可用性&#xff08;Availability&#xff09;分区容错性&#xff…

LLM应用:Prompt flow vs LangChain

背景 Prompt flow和LangChain都是LLM时代&#xff0c;为高效地构建LLM应用而生。 Prompt flow是Microsoft开源的&#xff0c;其诞生时&#xff0c;LangChain已经很有名气了。 所以作为后生的Prompt flow会为我们带来哪些新的东西呢&#xff1f; ​​​​​​​ Prompt flo…

一文了解JAVA的常用API

目录 常用kpimathSystemRuntimeObjectObjectsBigIntegerBigDecima正则表达式包装类 常用kpi 学习目的&#xff1a; 了解类名和类的作用养成查阅api文档的习惯 math 工具类。因为是工具类&#xff0c;因此直接通过类名.方法名(形参)即可直接调用 abs&#xff1a;获取参数绝对…

Docker容器与Serverless的融合:探索《2023腾讯云容器和函数计算技术实践精选集》中的云原生创新案例

Docker容器与Serverless的融合&#xff1a;探索《2023腾讯云容器和函数计算技术实践精选集》中的云原生创新案例 文章目录 Docker容器与Serverless的融合&#xff1a;探索《2023腾讯云容器和函数计算技术实践精选集》中的云原生创新案例一、引言二、《2023腾讯云容器和函数计算…

recover 的使用

一旦mayPanic触发了panic&#xff0c;控制流会跳到defer函数中&#xff0c;尝试执行recover。 如果recover捕获到了panic&#xff0c;它会阻止panic继续传播&#xff0c;程序控制流会继续在safeCall函数的defer函数之后进行。 然而&#xff0c;由于panic导致的提前返回&#xf…

Linux---多线程(下)

前情提要&#xff1a;Linux---多线程(上) 七、互斥 临界资源&#xff1a;多线程执行流共享的资源就叫做临界资源临界区&#xff1a;每个线程内部&#xff0c;访问临界资源的代码&#xff0c;就叫做临界区互斥&#xff1a;任何时刻&#xff0c;互斥保证有且只有一个执行流进入临…

SuccessFactors-cpi-SAP 错误重复机制

系统做复杂的模型不是全量传输&#xff0c;最复杂的是增量模型&#xff0c;增量模型的设计完善&#xff0c;程序的复杂度几何倍增长&#xff0c;今天就讨论下SuccessFactor与HCM集成的增量原理。 首先我们看看同步步骤&#xff0c;见下图 同步过程中有多次数据交互&#xff0c;…

时序预测 | Python实现VMD-CNN-LSTM时间序列预测

时序预测 | Python实现VMD-CNN-LSTM时间序列预测 目录 时序预测 | Python实现VMD-CNN-LSTM时间序列预测预测效果基本介绍模型描述代码设计预测效果 基本介绍 VMD-CNN-LSTM 是一种混合深度学习模型,结合了变分模态分解(VMD)、卷积神经网络(CNN)和长短期记忆网络(LSTM)的…

探索创新前沿,ATFX出席CriptoSummit峰会,共商数字资产市场生态构建

发现、连接并转变您的数字金融愿景。3月20日&#xff0c;以数字资产生态构建和多元化配置为主题的CriptoSummit峰会在智利首都圣地亚哥盛大召开。大会汇聚了智利和拉丁美洲的领导人、学术专家和数字资产爱好者&#xff0c;历时8小时的深度对话与交流&#xff0c;不仅吸引了500余…

Sublime Text4 4169 安装激活【亲测可用】

此教程用于Windows 下Sublime Text4 4169版本的安装和激活。 无需安装其他软件&#xff0c;无需下载替换文件&#xff0c;无需注册机等。 官网&#xff1a; https://www.sublimetext.com 下载地址 64位&#xff1a;https://download.sublimetext.com/sublime_text_build_41…

使用Redis集合List实现消息队列

系列文章目录 文章目录 系列文章目录前言前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型…

人体姿态识别项目 | 在EdgeTPU平台部署人体姿态识别算法

项目应用场景 面向 EdgeTPU 边缘计算设备平台上部署人体姿态识别算法 项目效果&#xff1a; 项目细节 > 具体参见项目 README.md (1) 安装依赖 sh install_requirements.sh (2) 执行图片检测示例 python3 simple_pose.py (3) 执行视频检测示例 python3 pose_camera.py# …

与鲸同行,智领未来!和鲸科技“人工智能+X”学科建设合作交流会(北京站)圆满结束!

在国家加快发展新质生产力的大背景下&#xff0c;3月25日下午&#xff0c;和鲸科技 2024 年“人工智能X”学科建设合作交流会&#xff08;北京站&#xff09;暨“AIX”实验室建设与供应商选型座谈会顺利召开。为提供更为集中和专业的讨论环境&#xff0c;本次会议特别采取闭门审…