Redisson实现分布式锁(看门狗机制)

news2024/9/23 9:34:57

目录

可重入锁:

 锁重试和看门狗机制:

主从一致性:


首先引入依赖,配置好信息

3.使用Redisson的分布式锁

可重入锁:

可重入锁实现是通过redsi中的hash实现的,key依旧是业务名称加id,然后第一个field存储线程唯一标识,value存储上锁的计数,同一个线程获取多次锁通过对锁的计数+来实现,释放通过-1来实现,当锁的数为零且锁是当前线程的锁的时候才可以释放锁

获取锁的lua脚本如下:

1.首先通关exists去判断这个key是否有锁

2.如果没有锁,则直接获取锁,通过hset命令创建所,通过expire设置过期时间。 

3.如果锁存在,则根据field中存储的线程标识判断是否是当前线程的锁

3.1 如果是自己的,则获得锁,通过hincrby将锁的重入次数加1,并设置有效期

3.2 如果锁不是自己的,则获取失败

释放锁的lua脚本如下:

1.首先判断锁是否被自己持有,根据线程波标识,如果不是自己的,说明已经被释放

2.如果线程是自己的,则判断锁的重入次数是否大于0,

2.1 如果大于0说明不能释放,则对重入次数-1并重置有效期

2.2 如果等于0,则释放锁

 锁重试和看门狗机制:

   获取锁:

1.首先线程进入之后会尝试获取锁,

1.1如果获取成功,且没有设置过期时间,则会自动设置一个看门狗,锁有效期为30s,看门狗会每隔10s去检查线程是否执行完成,如果没有执行完成,则继续续10s时长, 

1.2如果获取锁失败,则进入自旋去不断尝试获取锁,这中间有个判断剩余时间,如果超时,则返回false,如果没超时且拿到了释放锁的信号,则去尝试获取锁

释放锁:

1.线程首先尝试去释放锁,如果释放锁成功,则发送释放锁的消息,并取消看门狗

2.如果失败则记录异常并返回

总结:

可重入:redisson不同于redsi的setnx,他利用hash结构记录线程id和重入次数。

可重试:利用信号量,获取锁失败的会在等待时间内不断重复去获取锁

超时续约:利用看门狗机制,默认30s,每隔10s去判断锁是否释放,如果没释放则续期重置时间,释放则取消看门狗。

那么到这里我们已经解决了三个问题,现在还有主从一致性问题没有解决:

主从一致性:

redis的主从模式是指有一个主节点和多个从节点,主节点负责写操作,从节点负责读操作

主从同步是有一定延迟性的,所以这里需要确保主从的同步

这里就可以设置多个独立节点来实现,redisson封装了一个getMutiLock方法,他会尝试去获取每一个节点上的锁,只有都获取成功,才会真正拿到锁

获取锁之后使用方法和以前是一样的。

这样可以确保多节点的一致性,但是缺点就是运维成本较高,实现复杂

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

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

相关文章

正式发售!《黑神话:悟空》背后的技术力量——UE5与实时云渲染

千呼万唤始出来,《黑神话:悟空》终于在今年8月发售了,相信大家都已经玩起来了! 作为国产游戏的画质巅峰之作,《黑神话:悟空》凭借其令人叹为观止的画面质量和游戏体验,赢得了广泛的好评。这一切…

实时监控分析广告数据跳转统计平台源码

广告跳转实时分析页面统计系统,可选择生成html页面样式,可自定义设置页面域名后缀,可指定跳转指定网址, 可记录单个页面的访问记录,可对生成的单个链接进行备注,自定义等待时间进行跳转。 源码下载&#…

内网渗透- 内网渗透的基本知识

攻击流程讲解 内网介绍 内网也指局域网,是指在某一区域内由多台计算机互联而成的计算机组,组网范围通常在数千米以内。在局域网中,可以实现文件管理、应用软件共享、打印机共享、工作组内的日程安排、电子邮件和传真通信服务等。内网是封闭的…

Python 课程11-Web 开发

前言 Web 开发已经成为现代软件开发的核心领域之一,许多应用程序和服务都通过 Web 来与用户和其他系统交互。Python 作为一门广泛使用的编程语言,提供了多种 Web 开发框架,其中最流行的两个框架是 Flask 和 Django。 Flask 是一个轻量级的 W…

Dubbo SPI源码

文章目录 Dubbo SPI使用方式AOP功能源码剖析SPI注解1.获取加载器2.获取拓展实例对象3.创建拓展类的实例对象 Dubbo SPI Dubbo 的 SPI(Service Provider Interface)机制是一种强大的扩展机制,它允许开发者在运行时动态地替换或增加框架的功能。…

2-95 基于matlab的模板定位

基于matlab的模板定位。利用①相关匹配(Correlation Matching)、②基于Hausdorff距离匹配方法 及③考虑对场景图象距离变换(Distance Transform)的Hausdorff距离匹配方法,实现模板目标在场景图象中的定位。程序已调通,…

XShell快速连接虚拟机(Ubuntu系统)

目录 前言 一 (XShell)(虚拟机 )(Ubuntu)下载 二 虚拟机的ip查找 三 虚拟机中安装连接环境 四 开启ssh-server服务 五 验证是Ubuntu是否开启ssh-server服务 六 连接XShell软件 前言 对于刚开始探索 Linux 世界的新手来说,拥有一台自己的服务器可能并不现实。幸运的…

linux服务器配置及服务器资源命令使用查看

在做i性能压测之前,所了解的服务器配置:CPU、内存、硬盘、网络 一、查看cpu信息 常用命令:cat /proc/cpuinfo或者lscpu、pidstat等 需要关注的: Architecture: x86_64 # 架构信息,表示系统的CPU架构为x86_64&#…

业务资源管理模式语言14

第三节:在前面讨论的Resource Transcations(资源事务)中有许多共同的行为。其中一个行为可以包含多个项目,每个项目对应一个不同的资源(ItemizeTheResourceTransaction(11)。事务可以产生一些报…

GitLab权限及设置

之前很少关注这些,项目的权限,一般由专门的管理人员设置。 但自己创建的项目自己可以设置权限。下面是一些笔记。 GitLab中用户权限_gitlab 权限-CSDN博客 开发中遇到要将自己这块的代码上传到Git,由其他组的同事拉取后继续开发。上传代码后…

【JVM】概述

前言 Java的技术体系主要由支撑Java程序运行的虚拟机、提供各开发领域接口支持的Java类库、Java编程语言及许许多多的第三方Java框架(如Spring、MyBatis等)构成。在国内,有关Java类库API、Java语言语法及第三方框架的技术资料和书籍非常丰富&…

Oracle从入门到放弃

Oracle从入门到放弃 左连接和右连接Where子查询单行子查询多行子查询 from子句的子查询select子句的子查询oracle分页序列序列的应用 索引PL/SQL变量声明与赋值select into 赋值变量属性类型 异常循环游标存储函数存储过程不带传出参数的存储过程带传出参数的存储过程 左连接和…

【爬虫软件】批量采集抖音主页已发布作品

一、背景介绍 以下xx代表你猜中的部分。 1.1 爬取目标 用python开发的xx爬虫采集软件,可自动按博主抓取其已发布视频。 为什么有了源码还开发界面软件呢?方便不懂编程代码的小白用户使用,无需安装python,无需改代码,…

瞳孔检测系统源码分享

瞳孔检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

CS61C 2020计算机组成原理Lecture01-数字表示,溢出

1. 原码 原码就是符号化的数值,其编码规则简单直观:正数符号位用0表示,负数符号位用1表示,数值位保持不变。 x0.1101,则[x]原0.1101;x1101,则[x]原01101x -0.1111,则[x]原1.1111&…

《Mesh 组网和 AC+AP 组网的优缺点》

Mesh 组网和 ACAP 组网的优缺点。 Mesh 组网的优点: 1. 部署灵活:节点之间可以通过无线方式连接,新增节点比较方便,无需事先规划布线。 2. 自我修复和优化:如果某个节点出现故障,网络可以自动重新路由数据&…

MyBatis 数据处理:主键获取、批量删除与动态表名

目录 MyBatis 数据处理:主键获取、批量删除与动态表名 1.主键获取 1)mapper接口 2)mapper.xml 3)测试代码 4)测试结果 2.批量删除 1)mapper接口 1-使用手动拼接字符串数组的方法 2-使用mybatis中的foreach标…

【数据结构与算法 | 每日一题 | 力扣篇】力扣1184

1. 力扣1184:公交站间的距离 1.1 题目: 环形公交路线上有 n 个站,按次序从 0 到 n - 1 进行编号。我们已知每一对相邻公交站之间的距离,distance[i] 表示编号为 i 的车站和编号为 (i 1) % n 的车站之间的距离。 环线上的公交车…

微信支付开发-程序开发

一、操作流程图 二、后端代码实现 1、题库实现 a、列表、所有、详情、保存、启禁用、导入答题 b、获取奖品信息、保存奖品信息、 class Question extends Base {// 列表public function getList(){$param $this->request->param();$where [];if(!empty($param[title])…

spdlog二次封装

这里写自定义目录标题 封装的原因封装的思想初始化接口的封装对日志输出接口进行宏的封装 封装的原因 1.避免单例的锁冲突,因此直接创建全局的线程安全的日志器进行使用 2.因为日志输出没有文件名行号,因此使用宏进行二次封装输出日志的文件名和行号 3.…