Redisson 分布式锁

  • Redis是基础客户端库,可用于执行基本操作。

  • Redisson是基于Redis的Java客户端,提供高级功能如分布式锁、分布式集合和分布式对象。

  • Redisson提供更友好的API,支持异步和响应式编程,提供内置线程安全和失败重试机制。

实现步骤:

 <dependency>
            <groupId>org.redisson</groupId>
            <artifactId>redisson</artifactId>
            <version>3.12.0</version>
        </dependency>

@Configuration
public class MyRedissonConfig {

    @Bean
    public RedissonClient redisson(){
        Config config = new Config();
        config.useSingleServer().setAddress("redis://192.168.127.129:6379");
        RedissonClient redissonClient = Redisson.create(config);
        return redissonClient;
    }
}

通过导入坐标和配置,注入RedissonClient对象之后,就可以通过API操作

如:获取可重入锁

@ResponseBody  //因为返回的是json数据
    @GetMapping("/hello")
    public String hello(){
        //获取一把锁  只要锁的名字一样就是通一把锁   是一个可重入的锁
        RLock myLock = redissonClient.getLock("myLock");

        /**
         *
         * 默认都是30s
         * 加锁   阻塞式等待  锁的自动续期看门狗原理(如果业务超长,会在运行期间自动给锁续上新的30秒)
         * 不要担心锁自动过期被删除
         * 加锁的业务完成,就不会续期,即使不手动解锁,锁也会在30秒之后自动解锁  所有不会有死锁问题
         */

//        myLock.lock();//阻塞式等待

        myLock.lock(10, TimeUnit.SECONDS);//获取锁之后10秒之后自动解锁  不会自动续期  自动解锁时间一定要大于业务执行事件   注意使用
        try {
            //业务代码
            System.out.println("加锁成功 执行业务。。。。"+ Thread.currentThread().getId());
            Thread.sleep(20000);
        }catch (Exception e){

        }finally {
            //解锁
            System.out.println("释放锁。。。。"+ Thread.currentThread().getId());
            myLock.unlock();
        }



        return "hello";
    }

读写锁:保证一定能读到最新数据,修改期间写锁是一个排他锁

        如果都是读,则都会同时加锁成功,可以理解为无锁

        如果先写后读,则必须等待写锁释放才行

        如果同时写,也必须等待写锁释放才行,阻塞的方式、如何

        如果先读后写,也必须等待读锁释放

写锁:是一个互斥锁

读锁:是一个共享锁,和无锁是一样的

        

@ResponseBody  //因为返回的是json数据
    @GetMapping("/read")
    public String readValue(){
        //获取读写锁
        RReadWriteLock readWriteLock = redissonClient.getReadWriteLock("rw-Lock");
        String s = "";
        RLock rLock = readWriteLock.readLock();
        rLock.lock();
        try{
            s = redisTemplate.opsForValue().get("rwLock");
        }catch (Exception e){

        }finally {
            rLock.unlock();
        }
        return s;
    }

    @ResponseBody  //因为返回的是json数据
    @GetMapping("/write")
    public String writeValue(){
        //获取读写锁
        RReadWriteLock readWriteLock = redissonClient.getReadWriteLock("rw-Lock");
        RLock rLock = readWriteLock.writeLock();
        String s = UUID.randomUUID().toString();
        try{
            rLock.lock();
            redisTemplate.opsForValue().set("rwLock", s);
            Thread.sleep(30000);
        }catch (Exception e){

        }finally {
            rLock.unlock();
        }
        return s;
    }

 信号量:典型案例车库停车等。。。。

闭锁:案例放假 锁门 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【算法】活用双指针完成复写零操作

Problem: 1089. 复写零 文章目录 题目解析算法原理分析找到最后一个复写的位置从后往前进行复写操作 代码展示 题目解析 首先我们来分析一下本题的题目意思 可以看到题目中给到了一个数组&#xff0c;意思是让我们将数组中的零元素都复写一遍&#xff0c;然后将其余的元素向后平…

云计算在IT领域的发展和应用

文章目录 云计算的发展历程云计算的核心概念云计算在IT领域的应用1. 基础设施即服务&#xff08;IaaS&#xff09;&#xff1a;2. 平台即服务&#xff08;PaaS&#xff09;&#xff1a;3. 软件即服务&#xff08;SaaS&#xff09;&#xff1a; 云计算的拓展应用结论 &#x1f3…

无涯教程-PHP - 全局变量函数

全局变量 与局部变量相反,可以在程序的任何部分访问全局变量。通过将关键字 GLOBAL 放置在应被识别为全局变量的前面,可以很方便地实现这一目标。 <?php$somevar15;function addit() {GLOBAL $somevar;$somevar;print "Somevar is $somevar";}addit(); ?> …

NineData中标移动云数据库传输项目(2023)

近日&#xff0c;玖章算术NineData智能数据管理平台成功中标《2023年移动云数据库传输服务软件项目》&#xff0c;中标金额为406万。这标志着玖章算术NineData平台已成功落地顶级运营商行业&#xff0c;并在数据管理方面实现了大规模应用实践。 NineData中标2023移动云数据库传…

LabVIEW硬件在环仿真模拟电路故障分析和特征提取

LabVIEW硬件在环仿真模拟电路故障分析和特征提取 与数字电路相比&#xff0c;模拟电路故障分析是一项具有挑战性的任务。这主要是由于模拟分立元件的非线性特性&#xff0c;以及其他因素&#xff0c;包括噪声和内部可访问性的限制。参数故障和灾难性故障是模拟电路中发生的两种…

使用IDEA把Java程序打包成jar

点击左上角File,选择Project Structure 左侧选中Artifacts,点击右侧的号 选择JAR->From modules with dependencies 选择你要运行的main方法所在的类,选好了点击OK Artifacts添加完成后点击右下角OK 在工具栏中找到Build,选择Build Artifacts 刚才创建好的Artifacts,选择Bui…

阿里云使用WordPress搭建个人博客

手把手教你使用阿里云服务器搭建个人博客 一、免费创建服务器实例 1.1 点击试用 点击试用会需要你创建服务器实例&#xff0c;直接选择默认的操作系统即可&#xff0c;点击下一步 1.2 修改服务器账号密码 二、创建云数据库实例 2.1 免费获取云数据库使用 2.2 实例列表页 在…

ORB-SLAM系列算法演进

ORB-SLAM算法是特征点法的代表&#xff0c;当前最新发展的ORB-SLAM3已经将相机模型抽象化&#xff0c;适用范围非常广&#xff0c;虽然ORB-SLAM在算法上的创新并不是很丰富&#xff0c;但是它在工程上的创新确实让人耳目一新&#xff0c;也能更好的为AR、机器人的算法实现落地。…

【笔记】MySQL行转列函数

GROUP_CONCAT()函数 创建表person_info&#xff0c;并插入数据 CREATE TABLE person_info (id bigint(20) NOT NULL AUTO_INCREMENT,name varchar(100) DEFAULT NULL,family varchar(100) DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT8 DEFAULT CHARSETutf8;…

测试驱动开发(TDD)

测试驱动开发&#xff08;TDD&#xff09; 本篇文章简单叙述一下什么是测试驱动开发&#xff0c;以及怎么进行测试驱动开发&#xff01; TDD &#xff08;Test Driven Development&#xff09;&#xff1a;&#xff08;源于极限编程&#xff08;XP&#xff09;&#xff09;在不…

gitee远程仓库——Git常用远程仓库托管服务

远程仓库 我们的代码不能总是放在本地&#xff0c;因为总是放在本地&#xff0c;一旦电脑出现故障&#xff0c;数据将丢失&#xff0c;怎么共享呢&#xff1f;这里我们需要一个服务器&#xff0c;我们可以把代码放到服务器上&#xff0c;然后让别人下载&#xff0c;这样我们既…

【Apollo学习笔记】——规划模块TASK之PATH_BORROW_DECIDER

文章目录 前言PATH_BORROW_DECIDER功能简介PATH_BORROW_DECIDER相关配置PATH_BORROW_DECIDER总体流程PATH_BORROW_DECIDER相关子函数IsNecessaryToBorrowLaneIsBlockingObstacleFarFromIntersectionIsNonmovableObstacleCheckLaneBorrow 参考 前言 在Apollo星火计划学习笔记—…

微信小程序 echarts 画多个横向柱状图

然后是json {"usingComponents": {"ec-canvas": "../../common/ec-canvas/ec-canvas"},"navigationBarTitleText": "主题活动" } ec-canvas获取方式 在链接里下载代码 然后copy ec-canvas文件夹到自己的项目 https://gi…

长胜证券:越南首富,又火了!旗下汽车股市值盘中超越比亚迪!

当地时刻8月22日&#xff0c;美股三大股指涨跌纷歧&#xff0c;其中&#xff0c;道指跌0.51%&#xff0c;标普500指数跌0.28%&#xff0c;纳斯达克指数涨0.06%。 异动股方面&#xff0c;8月22日周二&#xff0c;越南电动轿车出产商VinFast Auto ADR盘中上涨超越167%&#xff0c…

Python 合并多个 PDF 文件并建立书签目录

今天在用 WPS 的 PDF 工具合并多个文件的时候&#xff0c;非常不给力&#xff0c;居然卡死了好几次&#xff0c;什么毛病&#xff1f;&#xff01; 心里想&#xff0c;就这么点儿功能&#xff0c;居然收了我会员费都实现不了&#xff1f;不是吧…… 只能自己来了&#xff0c;…

职业学院物联网实训室建设方案

一、概述 1.1专业背景 物联网&#xff08;Internet of Things&#xff09;被称为继计算机、互联网之后世界信息产业第三次浪潮&#xff0c;它并非一个全新的技术领域&#xff0c;而是现代信息技术发展到一定阶段后出现的一种聚合性应用与技术提升&#xff0c;是随着传感网、通…

Googel Earth Engine 配置Python 环境

1. 安装并配置python环境 此处不再赘述 2. 安装 earthengine-api pip install earthengine-api C:\Users\xixi>pip install earthengine-api Collecting earthengine-apiUsing cached earthengine_api-0.1.363-py3-none-any.whl Requirement already satisfied: google-c…

数据结构 - 线性表的定义和基本操作

一、定义 线性表是具有相同特性的数据元素的一个有限序列。 线性表&#xff1a; 由n(n≥0)个数据元素&#xff08;结点&#xff09;组成的有限序列。线性表中数据元素是一对一的关系&#xff0c;每个结点最多有一个直接前驱&#xff0c;和一个直接后继 二、线性表的基本操作 …

无涯教程-PHP - 条件判断

if... elseif ... else和switch语句用于根据不同条件进行判断。 您可以在代码中使用条件语句来做出决定&#xff0c; PHP支持以下三个决策语句- if ... else语句 - 如果要在条件为真时执行&#xff0c;而在条件不为真时执行另一个代码&#xff0c;请使用此语句 els…

江西萍乡能源石油化工阀门三维扫描3d测量抄数建模-CASAIM中科广电

长期以来&#xff0c;石油天然气、石油石化、发电和管道输送行业在环保、健康和安全保障方面一直承受着巨大的压力&#xff0c;他们必须确保相关规程在各项作业中得到全面贯彻。 阀门作为流体管道运输中的组成部分&#xff0c;其装配密封度是保证流体运输安全的重要一环&#…