Redisson分布式锁(超时释放及锁续期)
🍓 简介:java系列技术分享(👉持续更新中…🔥)
🍓 初衷:一起学习、一起进步、坚持不懈
🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏
🍓 希望这篇文章对你有所帮助,欢迎点赞 👍 收藏 ⭐留言 📝🍓 更多文章请点击
文章目录
- 一、分布式锁简介
- 二、为什么用分布式锁?
- 三、分布式锁应该具备哪些条件
- 四、Redis实现分布式锁如何防止死锁?
- 五、Redis实现分布式锁如何合理的控制锁的有效时长?
- 六、Redisson使用步骤
- 6.1 引入依赖
- 6.2 定义配置类
- 6.2.1 单机redis
- 6.2.2 集群redis
- 6.3 分布式锁工具类(两种获取锁方式)
- 6.4 业务代码加入分布式锁
一、分布式锁简介
分布式锁 是一种用于分布式系统中协调多个节点对共享资源进行互斥访问的机制。它确保在同一时间只有一个节点可以执行某个操作或访问某个资源,从而避免数据不一致或冲突。
概述 :在分布式系统中,多个线程访问共享数据就会出现数据安全性的问题。而由于jdk中的锁要求多个线程在同一个jvm中,因此在分布式系统中无法使用jdk中的锁保证数据的安全性,那么此时就需要使用分布式锁。
二、为什么用分布式锁?
作用 :可以保证在分布式系统中多个线程访问共享数据时数据的安全性
资源互斥访问:确保多个节点或进程在访问共享资源时不会发生冲突。避免重复操作:防止同一任务被多个节点重复执行。数据一致性:在分布式系统中,确保数据的一致性和完整性。任务调度:在分布式任务调度系统中,确保任务不会被多个节点同时执行(例如:定时任务)。
三、分布式锁应该具备哪些条件
- 在分布式系统环境下,一个方法在同一时间只能被一个机器的一个线程执行
- 高可用的获取锁与释放锁
- 高性能的获取锁与释放锁
- 具备可重入特性
- 具备锁失效机制,防止死锁
四、Redis实现分布式锁如何防止死锁?
产生死锁的原因:如果一个客户端持有锁的期间突然崩溃了,就会导致无法解锁,最后导致出现死锁的现象。
所以要有个超时的机制,在设置key的值时,需要加上有效时间,如果有效时间过期了,就会自动失效,就不会出现死锁。
五、Redis实现分布式锁如何合理的控制锁的有效时长?
有效时间设置多长,假如我的业务操作比有效时间长?我的业务代码还没执行完就自动给我解锁了,不就废废了吗。
锁续期实现思路: 当加锁成功后,同时开启守护线程,默认有效期是用户所设置的,然后默认每隔10秒就会给锁续期到用户所设置的有效期(可以修改),只要持有锁的客户端没有宕机,就能保证一直持有锁,直到业务代码执行完毕自己解锁,如果宕机了自然就在有效期失效后自动解锁。
这些都可以通过以使用redis官方所提供的Redisson进行实现。
六、Redisson使用步骤
6.1 引入依赖
<dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.34.1</version><exclusions><exclusion><groupId>org.redisson</groupId><artifactId>redisson-spring-data-33</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-data-23</artifactId><version>3.34.1</version></dependency>
6.2 定义配置类
6.2.1 单机redis
spring:redis:host: 192.168.1.0port: 6379password: abcdefghijkdatabase: 1
@Configuration
public class RedissonConfig {@Value("${spring.redis.port}")private String port;@Value("${spring.redis.host}")private String host;@Value("${spring.redis.password}")private String password;@Value("${spring.redis.database}")private Integer database;@Beanpublic RedissonClient redissonClient(){Config config = new Config();//这边采用了【单节点模式】 - redis地址config.useSingleServer().setAddress("redis://"+host+":"+port).setPassword(password).setDatabase(database);//根据config创建出RedissonClient的实列RedissonClient redissonClient = Redisson.create(config);return redissonClient;}
}
6.2.2 集群redis
spring:redis:timeout: 6000msdatabase: 0password: abcdefghijk #密码,若没有,不填写cluster:nodes: #集群ip+端口号- 192.168.1.1:6379- 192.168.1.2:6380- 192.168.1.3:6381- 192.168.1.4:6382- 192.168.1.5:6383- 192.168.1.6:6384- 192.168.1.7:6385
@Configuration
public class RedissonConfig {@Autowiredprivate RedisProperties redisProperties;@Beanpublic RedissonClient redissonClient() throws IOException {Config config = new Config();if (redisProperties.getCluster() != null) {//集群模式配置List<String> urls = redisProperties.getCluster().getNodes();String[] clusterNodes = urls.toArray(new String[urls.size()]);for (int i = 0; i < clusterNodes.length; i++) {clusterNodes[i] = "redis://" + clusterNodes[i];}ClusterServersConfig clusterServersConfig = config.useClusterServers().addNodeAddress(clusterNodes);if (StrUtil.isNotBlank(redisProperties.getPassword())) {clusterServersConfig.setPassword(redisProperties.getPassword());}} else {//单节点配置String address = "redis://" + redisProperties.getHost() + ":" + redisProperties.getPort();SingleServerConfig serverConfig = config.useSingleServer();serverConfig.setAddress(address);if (StrUtil.isNotBlank(redisProperties.getPassword())) {serverConfig.setPassword(redisProperties.getPassword());}serverConfig.setDatabase(redisProperties.getDatabase());}config.setLockWatchdogTimeout(15000);return Redisson.create(config);}
}
6.3 分布式锁工具类(两种获取锁方式)
@Component
@Slf4j
public class RedissonLockUtil {@Autowiredprivate RedissonClient redissonClient;/*** 获取分布式锁(如果业务逻辑执行时间不确定,或者可能较长,建议启用看门狗机制。)** @param name 锁的key值* @param waitTime 获取锁的最大等待时间* @param unit 时间单位* @return true: 获取到锁, false: 没有获取到锁*/public boolean getLock(String name, long waitTime, TimeUnit unit) throws InterruptedException {RLock lock = redissonClient.getLock(name);//没有设置锁释放时间 看门狗机制会自动续期锁的租约时间,避免锁提前释放。锁会在租约时间后自动释放,避免死锁。boolean succeed = lock.tryLock(waitTime, unit);return succeed;}/*** 获取分布式锁 (如果业务逻辑执行时间较短且可控,可以显式设置 leaseTime,避免看门狗机制的开销)* @param name 锁的key值* @param waitTime 获取锁的最大等待时间* @param leaseTime 锁的自动释放时间(超时释放)* @param unit 时间单位* @return true: 获取到锁, false: 没有获取到锁*/public boolean getLock(String name, long waitTime, long leaseTime, TimeUnit unit) throws InterruptedException {RLock lock = redissonClient.getLock(name);boolean succeed = lock.tryLock(waitTime, leaseTime, unit);return succeed;}/*** 解锁分布式锁* @param name 锁key值*/public void unLock(String name){RLock lock = redissonClient.getLock(name);lock.unlock();}
}
6.4 业务代码加入分布式锁
public void executeInternal(JobExecutionContext jobExecutionContext) {boolean lock = false;try {lock = redissonLockUtil .getLock(ZNJ_COCKPIT_TECH_TRAINING_JOB, 5, 10, TimeUnit.SECONDS);if (lock){log.info("=====================[获取锁,正式开始业务逻辑]============");//赋能模块表同步//业务逻辑log.info("====================[释放锁,业务逻辑执行结束]============");}} catch (Exception e) {log.error("获取锁失败:e:{}",e.getMessage());} finally {redisUtils.unLock(ZNJ_COCKPIT_TECH_TRAINING_JOB);}log.info("=====================[end]================= lock:{}",lock);
}

![]()

相关文章:
Redisson分布式锁(超时释放及锁续期)
🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢…...
音视频学习(三十):fmp4
FMP4(Fragmented MP4)是 MP4(MPEG-4 Part 14)的扩展版本,它支持流式传输,并被广泛应用于DASH(Dynamic Adaptive Streaming over HTTP)和HLS(HTTP Live Streaming…...
【语料数据爬虫】Python爬虫|批量采集讲话稿数据【范文网】(2)
前言 本文是该专栏的第7篇,后面会持续分享Python爬虫采集各种语料数据的的干货知识,值得关注。 本文,笔者将主要介绍基于Python,来实现批量采集范文网“讲话稿”数据。同时,本文也是采集“讲话稿”数据系列的第2篇。 采集相关数据的具体细节部分以及详细思路逻辑,笔者将…...
Java安全-类的动态加载
类的加载过程 先在方法区找class信息,有的话直接调用,没有的话则使用类加载器加载到方法区(静态成员放在静态区,非静态成功放在非静态区),静态代码块在类加载时自动执行代码,非静态的不执行;先父类后子类,…...
内存取证之windows-Volatility 3
一,Volatility 3下载 1.安装Volatility 3。 要求:python3.7以上的版本,我的是3,11,这里不说python的安装方法 使用 pip 安装 Volatility 3: pip install volatility3 安装完成后,验证安装: v…...
WIFI p2p连接总结
p2p 设备角色 go 为 group owner,类似 ap 的功能,控制 p2p 组,每个 group 只有一个 go gc 是 client,为连接 go 的设备,是组成员 P2P 扫描 p2p discovery 利用 probe request 和 probe response 帧来搜索周围的 p2…...
React Native进阶(六十):webview实现屏蔽所嵌套web页面异常弹窗
文章目录 一、前言二、解决方案三、注意事项四、拓展阅读 一、前言 在React Native项目集成web页面时,webview嵌套方式是常用方式。如果所嵌套的web页面由于某种不可控因素导致出现错误弹窗信息,webview作为web嵌套方式应该对其行为可控。 React Nativ…...
fastapi+playwright爬取google搜索1-3页的关键词返回json
1,playwright无头 2,代理池随机获取代理ip 3,随机浏览行为,随机页面滚动 4,启用stealth模式 5,随机延时搜索 from fastapi import FastAPI, HTTPException from fastapi.responses import JSONResponse import asyncio from concurrent.futures import ThreadPool…...
施磊老师高级c++(五)
文章目录 一、设计模式二、单例模式(创建型模式)- 重点(共三种代码)1.1 饿汉式单例模式 -- 不受欢迎1.2 懒汉式单例模式 -- 受欢迎1.3 线程安全的懒汉式单例模式--锁volatile 三、工厂模式(创建型模式)3.1 简单工厂模式3.2 工厂方…...
鸿蒙相机开发实战:从设备适配到性能调优 —— 我的 ArkTS 录像功能落地手记(API 15)
引言:为什么我要写这份开发指南? 作为一名老技术,最近特别喜欢研究鸿蒙相机功能,而且目前已经更新到API15了,那么咱们更要好好研究一下。而且从手持云台到车载记录仪,每个项目都面临独特挑战:车…...
MySQL中怎么分析性能?
MySQL中主要有4种方式可以分析数据库性能,分别是慢查询日志,profile,Com_xxx和explain。 慢查询日志 先用下面命令查询慢查询日志是否开启, show variables like slow_query_log;# 一般默认都是以下结果 ---------------------…...
阿里云对象存储教程
搜“对象存储->免费试用” 选择你的心仪产品,我使用的是第一个 创建后获得三个实例: 点击右上角自己的账号可以进入到AccessKey管理界面 回到对象存储控制台创建Bucket实例 在以下文件中替换自己Bucket的信息即可美美使用~ package com.kitty.blog…...
【Node.js入门笔记10---http 模块】
Node.js入门笔记10 Node.js---http 模块一、核心功能0.学习http的前提1. 创建 HTTP 服务器2. 处理请求和响应 二、进阶用法1. 路由管理2. 处理 POST 请求3. 中间件模式 三、常见场景四、错误处理与安全五、对比 http 与 Express六、工具库推荐: Node.js—http 模块 …...
深拷贝在 JavaScript 中的几种实现方式对比
深拷贝在 JavaScript 中的几种实现方式对比 1. JSON 序列化法2. 结构化克隆(structuredClone)原理与使用 3. 自定义深拷贝函数原理与使用 性能对比与选择建议性能比较 综合建议:示例代码整合总结 在开发过程中,我们经常需要对对象…...
实验11 机器学习-贝叶斯分类器
实验11 机器学习-贝叶斯分类器 一、实验目的 (1)理解并熟悉贝叶斯分类器的思想和原理; (2)熟悉贝叶斯分类器的数学推导过程; (3)能运用贝叶斯分类器解决实际问题并体会算法的效果&a…...
Delta Lake 解析:架构、数据处理流程与最佳实践
Delta Lake 是一个基于 Apache Spark 的开源存储层,主要解决传统数据湖(Data Lake)缺乏 ACID 事务、数据一致性和性能优化的问题,使大数据处理更加可靠、高效。从本质上讲,它让数据湖具备了数据仓库的结构化管理能力&a…...
OpenHarmony子系统开发 - 电池管理(二)
OpenHarmony子系统开发 - 电池管理(二) 五、充电限流限压定制开发指导 概述 简介 OpenHarmony默认提供了充电限流限压的特性。在对终端设备进行充电时,由于环境影响,可能会导致电池温度过高,因此需要对充电电流或电…...
hive 数据简介
Hive介绍 1)Hive简介 Hive是基于Hadoop的一个数据仓库工具,用于结构化数据的查询、分析和汇总。Hive提供类SQL查询功能,它将SQL转换为MapReduce程序。 Hive不支持OLTP,Hive无法提供实时查询。 2)Hive在大数据生态环境…...
Win32桌面编程:ACLUI.DLL,EditSecurity(IntPtr hwndOwner, ISecurityInformation psi)
在Windows编程中,我们通常需要借助通用对话框的力量,今天我们就聊一下“安全属性表”通用对话框的使用心得。 当我们调用EditSecurity函数时: 1.EditSecurity将调用ISecurityInformation中的GetObjectInformation函数 在编写 ISecurityInf…...
数据分析异步进阶:aiohttp与Asyncio性能提升
一、时间轴呈现方案进程 2023-04-01:需求确认 确定目标:使用aiohttp与Asyncio提升采集性能,目标采集今日头条网站的新闻数据(标题、内容、时间等)。同时要求在程序中加入代理IP、Cookie和UserAgent的设置,…...
《AI大模型趣味实战 》第8集:多端适配 个人新闻头条 基于大模型和RSS聚合打造个人新闻电台(Flask WEB版) 2
《AI大模型趣味实战 》第8集:多端适配 个人新闻头条 基于大模型和RSS聚合打造个人新闻电台(Flask WEB版) 2 摘要 本文末尾介绍了如何实现新闻智能体的方法。在信息爆炸的时代,如何高效获取和筛选感兴趣的新闻内容成为一个现实问题。本文将带领读者通过P…...
低配电脑畅玩《怪物猎人:荒野》,ToDesk云电脑优化从30帧到144帧?
《怪物猎人:荒野(Monster Hunter Wilds)》自2025年正式发售以来已取得相当亮眼的成绩,仅用三天时间便轻松突破800万销量,目前顺利蝉联周榜冠军;凭借着开放世界的宏大场景和丰富的狩猎玩法,该游戏…...
Leetcode刷题笔记1 图论part03
卡码网 101 孤岛总面积 from collections import deque directions [[0, 1], [1, 0], [0, -1], [-1, 0]] count 0def main():global countn, m map(int, input().split())grid []for _ in range(n):grid.append(list(map(int, input().split())))for i in range(n):if gri…...
【模拟面试】计算机考研复试集训(第十一天)
文章目录 前言一、专业面试1、什么是面向对象编程?2、软件工程的主要模型有哪些?3、Cache和寄存器的区别4、卷积层有哪些参数,它们代表什么?5、你有读博的打算吗?6、你的师兄/姐临近毕业,仍做不出成果&…...
查看自己的公有ip
IP 地址 112.3.88.1** 是一个 公有 IP 地址,而不是私有 IP 地址。 公有 IP 地址 vs 私有 IP 地址 公有 IP 地址: 用于在互联网上唯一标识设备。由互联网服务提供商(ISP)分配。可以在全球范围内路由和访问。例如:112.3.88.156、8.8…...
【js逆向入门】图灵爬虫练习平台 第九题
地址:aHR0cHM6Ly9zdHUudHVsaW5ncHl0b24uY24vcHJvYmxlbS1kZXRhaWwvOS8 f12进入了debugger,右击选择一律不在此处暂停, 点击继续执行 查看请求信息 查看载荷,2个加密参数,m和tt 查看启动器,打上断点 进来 往…...
NET6 WebApi第5讲:中间件(源码理解,俄罗斯套娃怎么来的?);Web 服务器 (Nginx / IIS / Kestrel)、WSL、SSL/TSL
一、NET6的启动流程 区别: .NET6 WebApi第1讲:VSCode开发.NET项目、区别.NET5框架【两个框架启动流程详解】_vscode webapi-CSDN博客 2、WebApplicationBuilder:是NET6引入的一个类,是建造者模式的典型应用 1>建造者模式的…...
Nginx及前端部署全流程:初始化配置到生产环境部署(附Nginx常用命令)
nginx&前端从初始化配置到部署(xshell) 前言下载nginx前端打包与创建具体文件夹路径配置nginx.nginx.conf文件配置项内容 配置nginx.service文件配置项内容 启动nginx常用nginx命令 前言 目标:在xshell中部署前端包。 第一步:…...
python 实现一个简单的window 任务管理器
import tkinter as tk from tkinter import ttk import psutil# 运行此代码前,请确保已经安装了 psutil 库,可以使用 pip install psutil 进行安装。 # 由于获取进程信息可能会受到权限限制,某些进程的信息可能无法获取,代码中已经…...
【AI模型】深度解析:DeepSeek的联网搜索的实现原理与认知误区
一、大模型的“联网魔法”:原来你是这样上网的! 在人工智能这个舞台上,大模型们可是妥妥的明星。像DeepSeek、QWen这些大模型,个个都是知识渊博的“学霸”,推理、生成文本那叫一个厉害。不过,要是论起上网…...

