Redisson分布式锁使用

news2024/12/22 13:56:42

一、使用 RedisTemplate 操作分布式锁

原子加锁(uuid Value+过期时间)+原子解锁(lua脚本)+加长过期时间

  • UUID :让锁区分,防止错删其他锁
  • 设置锁过期时间:当业务异常导致无法释放锁形成锁死,设置过期时间自动释放锁
  • Lua脚本:能够保证删除操作的原子性
  • 加长过期时间:过期时间必须大于业务执行时间
	1.加锁 (set key)
	try{
		2.业务:向redis缓存存入数据
		(1)查redis缓存数据,缓存有直接返回,(2)缓存没查到直接查数据库,(3)在锁释放之前 放入redis缓存
	}
	catch{
		处理异常
	}
	finally{
		3.释放锁 (delete key)
	}
	
public Map<String, List<CategoryLevel2Vo>> getCatelogJsonFromDataWithRedisLock() {

        //set NX key不存在才能set
        //设置set lock hah EX 300 NX,设置过期时间EX,防止死锁,加锁跟设置过期时间必须是原子性操作
        String uuid = UUID.randomUUID().toString();
        Boolean lock = stringRedisTemplate.opsForValue().setIfAbsent("lock", uuid,300,TimeUnit.SECONDS);
        //lock为true set成功
        if (lock){
            System.out.println("获取分布式锁成功");
            //加锁成功
            Map<String, List<CategoryLevel2Vo>> dataFromDb;
            try {
                dataFromDb = getDataFromDb();
            } finally {
                //释放锁(删除lock)
                //使用lua删除锁脚本,或者值+比较值+删除锁(脚本可以保证原子性)
                String redisScript = "if redis.call(\"get\",KEYS[1]) == ARGV[1] then return redis.call(\"del\",KEYS[1]) else return 0 end";
                Long execute = stringRedisTemplate.execute(new DefaultRedisScript<Long>(redisScript, Long.class), Arrays.asList("lock"), uuid);
            }
            return dataFromDb;
        }else {
            //加锁失败
            System.out.println("获取分布式锁失败,等待重试");
            //休眠
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //自旋
            return getCatelogJsonFromDataWithRedisLock();
        }

二、Lock锁

Lock锁与RedisTemplate 操作分布式锁区别,为什么Lock锁不用循环判断是否拿到锁?

  • 自动续期,lock.lock()加锁时,看门狗LockWatchdogTimeout定时更新过期时间
  • 防止死锁,当业务异常导致无法释放锁,看门狗默认30s释放锁
1.加锁 lock.lock() 或 lock.lock(10, TimeUnit.SECONDS);
try{
	2.业务...
}catch{
	处理异常
}finally{
	3.释放锁 lock.unlock();
}

1.lock.lock(); 有续期
如果业务未完成,则锁自动续期,看门狗LockWatchdogTimeout默认时间30s,续期按
如果业务完成,则不会续期,如果不手动释放锁,默认30s后释放
如果占锁,则开启定时任务,重新设置过期时间(LockWatchdogTimeout),定时任务:使用掉三分之一的LockWatchdogTimeout就恢复成 30s

2.lock.lock(10, TimeUnit.SECONDS); 无续期,推荐使用
注意:设置锁时间必须大于业务执行时间,否则业务结束之前释放锁会被其他线程占锁,当业务结束释放时,删除了其他线程的锁
没有看门狗LockWatchdogTimeout
锁时间结束不会自动续期,设置锁时间大于业务执行时间

占锁成功,如果出现事故导致无法释放锁,在不抛出异常的情况下,会默认30s后释放锁,所以不会存在死锁的问题
在这里插入图片描述

@ResponseBody
    @GetMapping("/testRedisson")
    public String testRedisson(){
        RLock lock = redissonClient.getLock("my-lock");
        //加锁
        lock.lock();
        try {
            System.out.println("加锁成功:" + Thread.currentThread().getId());
            Thread.sleep(30000);
        } catch (InterruptedException e) {

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

        return "hello redisson";
    }

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

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

相关文章

【机器学习】集成学习(实战)

集成学习&#xff08;实战&#xff09; 目录 一、准备工作&#xff08;设置 jupyter notebook 中的字体大小样式等&#xff09;二、集成算法的基本思想三、集成算法的简单实现&#xff1a;硬投票与软投票1、构建测试数据集2、硬投票3、软投票 四、集成学习&#xff1a;Bagging …

chatgpt赋能python:Python图片定位:优化SEO的关键技术

Python图片定位&#xff1a;优化SEO的关键技术 在现代搜索引擎优化中&#xff0c;图片已成为吸引用户眼球和提升网站排名的关键元素之一。而Python作为一种功能强大的编程语言&#xff0c;在图片定位和SEO优化方面也具备很大的优势。 Python图片定位的基本原理 在Python中&a…

JAVA中.equals()与 ==的区别

1. “”是运算符&#xff0c;如果是基本数据类型&#xff0c;则比较存储的值&#xff1b;如果是引用数据类型&#xff0c;则比较所指向对象的地址值。 2..equals() equals是Object的方法&#xff0c;比较的是所指向的对象的地址值&#xff0c;一般情况下&#xff0c;重写之后比…

(五)Langchain PGVector 补充智能客服匹配式问答

文章目录 资料背景目标FAQ-匹配式问答安装PGVector 向量数据库text2vec-large-chineseLangchain-PGVector测试向量化文本写入QA问答对特别注意问题langchain pgvector表和数据相识性问题匹配 结论 资料 NLP领域五大QA问答场景总结&#xff1a;FQA、DOC-QA、KBQA、TableQA、Tas…

html+css+js实现的web小案例

上完了Web开发基础的课程之后&#xff0c;做了这么一个小案例作为课程的大作业。这个案例是静态页面&#xff0c;使用的技术有htmlcssjs&#xff0c;主要的知识点有页面的打开关闭、页面跳转、超链接、图片和音频的使用、轮播图、js函数等等。本案例的主要内容是注册、登陆之后…

PostgreSQL清理dead tuples(vacuum和vacuum full)

前言 PostgreSQL的并发控制&#xff0c;采用MVCC&#xff08;多版本并发控制&#xff09;进行处理。这种机制有一个缺点&#xff1a;随着时间的推移&#xff0c;数据文件中积累的dead tuples&#xff08;死数据/死元组&#xff09;会越来越多。 在清理dead tuples时&#xff…

redis第五第六章-redis并发缓存架构和性能优化

一、缓存设计 1.缓存穿透 缓存穿透是指查询一个根本不存在的数据&#xff0c; 缓存层和存储层都不会命中&#xff0c; 通常出于容错的考虑&#xff0c; 如果从存储层查不到数据则不写入缓存层。 缓存穿透将导致不存在的数据每次请求都要到存储层去查询&#xff0c; 失去了缓存…

高通 Camera HAL3:添加一个Feature

一.概述 以HDR Feature为例&#xff0c;在CamX中添加一个新的Feature 从上游stream(upstream) feature获取格式P010的多帧数据作为inputpipeline(SWMFMergeYuv)运行算法生成同样格式的单帧数据作为输出&#xff0c;发送给下游stream(down stream) feature 二.添加 2.1 从Feat…

自动计算图片的宽度和高度拉伸至全屏附CSS及VUE简单实现

1、简介 场景&#xff1a;比如说APP封面等特点&#xff1a;能够自动适应设备的宽高&#xff0c;保证图片100%显示&#xff0c;不会缺失或者留边&#xff0c;但有可能会变形。 2、实现 注意以下代码尽管是在Vue环境下实现的&#xff0c;但与Vue关系不大&#xff0c;代码本身也足…

【Python】列表 List ④ ( 插入操作 / 追加操作 | 列表插入操作 List#insert | 列表追加元素操作 List#append )

文章目录 一、列表插入操作1、List#insert 函数简介2、代码示例 - 列表插入元素 二、列表追加元素操作1、List#append 函数简介2、代码示例 - 列表追加元素 一、列表插入操作 1、List#insert 函数简介 Python 列表 通过调用 List#insert 函数 插入元素 , 该函数需要传入两个参数…

chatgpt赋能python:Python商场打折问题详解

Python商场打折问题详解 在商场营销策略中&#xff0c;打折是一种常见的手段。而Python作为一种广泛应用于数据科学和机器学习的编程语言&#xff0c;也可以用来解决商场打折问题。本文将介绍Python实现商场打折的方法和步骤&#xff0c;希望能对广大商场营销人员和数据科学家…

C语言——数据在内存中的存储(未完待续)

文章目录 一、数据类型的介绍1.0、有符号跟无符号计算原理在这里插入图片描述1.1、数据类型的基本分类 二、整形与浮点型在内存中的存储1.整型1.0、大小端的介绍 2.原码、反码、补码2.0、原码2.1、反码2.2、补码2.3、补码转原码第二种方法 三 、浮点型3.0、浮点数存储的例题&am…

20230604给coolpi4b开发板刷机的LOG

20230604给coolpi4b开发板刷机的LOG 2023/6/4 23:49 IMG I:\BaiduNetdiskDownload\20230317[在线刷机]-RKDevTool专用镜像 I:\BaiduNetdiskDownload\20230317[在线刷机]-RKDevTool专用镜像\Windows驱动程序\DriverAssitant_v5.12.zip I:\BaiduNetdiskDownload\20230317[在线…

WGCNA | 不止一个组的WGCNA怎么分析嘞!?~(三)(共识网络分析-第三步-共识模块与特异模块相关联)

1写在前面 有小伙伴子留言问最近介绍的WGCNA共识网络的意义是什么&#xff0c;保守性吗&#xff01;&#xff1f;&#x1f9d0; 与把雄性小鼠和雌性小鼠的数据merge在一起&#xff0c;一起构建网络、确定模块的方式有什么区别呢&#xff01;&#xff1f;&#x1f617; 其实区别…

JavaSE进阶(day13,复习自用)

单元测试、反射、注解、动态代理 单元测试单元测试概述单元测试快速入门单元测试常用注解 反射反射概述反射获取类对象反射获取构造器对象反射获取成员变量对象反射获取方法对象反射的作用-绕过编译阶段为集合添加数据反射的作用-通用框架的底层原理 注解注解概述自定义注解元注…

数据在内存中存储的现象

&#x1f929;本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 &#x1f970;内容专栏&#xff1a;这里是《C知识系统分享》专栏&#xff0c;笔者用重金(时间和精力)打造&#xff0c;基础知识一网打尽&#xff0c…

chatgpt赋能python:Python图片合成:背景设计的新方案

Python 图片合成&#xff1a;背景设计的新方案 简介 图像合成是一项艺术性和创新性的工作&#xff0c;它涉及到多个过程&#xff0c;包括图像处理、透明度和滤镜应用。Python 我们可以使用其各种库快速、可靠地进行图像合成。在这篇文章中&#xff0c;我们将介绍如何使用 Pyt…

chatgpt赋能python:Python在线模拟器:让编程变得更加轻松

Python 在线模拟器&#xff1a;让编程变得更加轻松 介绍 Python 在线模拟器是一个非常实用的工具&#xff0c;它可以帮助用户直接在浏览器中测试和运行 Python 代码。在线模拟器的出现简化了编程过程&#xff0c;不需要安装 Python IDE 等软件&#xff0c;只需要有一台连接互…

LSM零知识学习三、插桩原理实现细节(1)

本文内容参考&#xff1a; LSM(Linux Security Modules)框架原理解析_lsm框架_pwl999的博客-CSDN博客 Linux LSM(Linux Security Modules) Hook Technology_weixin_30929011的博客-CSDN博客 特此致谢&#xff01; 一、插桩具体实现 前文介绍了插桩原理&#xff0c;本文来详…

chatgpt赋能python:Python图片大小怎么算?

Python图片大小怎么算&#xff1f; 在Web开发中&#xff0c;经常需要展示图片&#xff0c;但是为了让网页加载速度更快&#xff0c;我们需要对图片进行压缩和优化&#xff0c;其中一个重要的参数就是图片的大小。那么在Python中&#xff0c;如何计算图片大小呢&#xff1f; 图…