当前位置: 首页 > news >正文

redis面试(十七)MultiLock加锁和释放锁

MultiLock

MultiLock,英语直译为多个锁。

redisson分布式锁中的MultiLock这个机制,可以将多个锁合并为一个大锁,对一个大锁进行统一的申请加锁以及释放锁

一次性锁定多个资源,再去处理一些事情,然后事后一次性释放所有的资源对应的锁

RLock lock1 = redisson.getLock("anyLock1");RLock lock2 = redisson.getLock("anyLock2");RLock lock3 = redisson.getLock("anyLock3");RedissonMultiLock multiLock = new RedissonMultiLock(lock1, lock2, lock3);multiLock.lock();multiLock.unlock();

在项目里使用的时候,很多时候一次性要锁定多个资源,比如说锁掉一个库存,锁掉一个订单,锁掉一个积分,一次性锁掉多个资源,多个资源都不让别人随意修改,然后你再一次性更新多个资源,释放多个锁

MultiLock的源码,我们初步看一下,其实也不过是没什么特别的,就是包裹了多个RedissonLock,底层就是尝试依次对每一个锁都要成功加锁,如果所有的锁都成功加锁了之后,那么就认为MultiLock就成功加锁了

释放锁

依次去释放每一把锁就可以
释放锁的代码一目了然,就是循环释放每一把锁。
在这里插入图片描述

加锁

再看一下的源码
在这里插入图片描述

这里的locks就是RedissonMultiLock中我们传的几个锁,锁的个数*3,基础等待时间baseWaitTime是4500毫秒。
if和else判断中都是算等待时间的逻辑。
而最下面的while死循环,就是要加锁的逻辑,就是不停地加锁,失败了继续加锁。只要没有全部获取到就一直循环。
在这里插入图片描述

RedissonMultiLock.tryLock()方法中
截止到226行,这几个时间分别是
watTime = 4500毫秒
time = 当前时间
remainTime = 4500毫秒
lockWaitTime = 4500毫秒
failedLocksLimit = 0
awaitTime = 4500毫秒

继续走,到for循环里面,取出来locks中的一个锁开始处理
调用了lock.tryLock()方法
这是获取锁的关键代码
lockAcquired = lock.tryLock(awaitTime, newLeaseTime, TimeUnit.MILLISECONDS);

lock是底层的RedissonLock,他没有使用lock.lock(),用的是tryLock(),指定了获取锁等待超时的时间,4500毫秒,必须获取到这个锁,如果获取不到这个锁,就退出,标记为获取锁失败

哪怕是获取到锁之后,这个锁在多长时间内会自动释放,newLeaseTime是-1,因为你的newLeaseTime是-1,所以说如果获取到了锁,会启动一个lock watchdog不断的刷新你的锁key的生存时间为30000毫秒
在这里插入图片描述

继续往下,现在情况是拿到锁之后,不会再走蓝色选中的代码了。

最后走到if (remainTime != -1)代码中去,这里的逻辑是怎么回事呢

remainTime = 4500毫秒
经过了一个lock的获取,可能消耗掉了比如说20毫秒,100毫秒,500毫秒,耗费了500毫秒
remainTime = 4500毫秒 - 500毫秒 = 4000毫秒
time = 当前时间

如果remainTime <= 0,意味着什么呢?获取锁的时间已经超过了4500毫秒了,迄今为止,你获取到这些所的时间,已经超过了预设的4500毫秒了,相当于是你获取多个锁的时间,最多不能超过4500毫秒

如果一旦获取各个锁的时间超过了4500毫秒,此时就会释放掉所有已经获取的锁,然后返回一个false,再次进入while true中的一个死循环,尝试走上述一模一样的流程

获取了三把锁,耗时了1000毫秒,此时remainTime还剩下3500毫秒,4477,4500,23毫秒获取了三把锁
在这里插入图片描述
释放锁的话,就是依次调用所有的锁的释放的逻辑,lua脚本,同步等待所有的锁释放完毕,才会返回

而加锁的话,默认的行为之下,你包裹了几把锁,就会锁数量 * 1500毫秒,获取所有的锁必须在多长时间之内就要结束,如果超时就会重新再次死循环尝试获取锁。使用的是各个锁的tryLock()方法,指定了说在获取每个单独的锁的时候,会有一个获取超时退出的时间

相关文章:

redis面试(十七)MultiLock加锁和释放锁

MultiLock MultiLock&#xff0c;英语直译为多个锁。 redisson分布式锁中的MultiLock这个机制&#xff0c;可以将多个锁合并为一个大锁&#xff0c;对一个大锁进行统一的申请加锁以及释放锁 一次性锁定多个资源&#xff0c;再去处理一些事情&#xff0c;然后事后一次性释放所…...

电脑开机LOGO修改教程_BIOS启动图片替换方法

准备工具&#xff1a;刷BIOS神器和change logo&#xff0c;打包下载地址&#xff1a;https://download.csdn.net/download/baiseled/89374686 一.打开刷BIOS神器&#xff0c;点击备份BIOS&#xff0c;保存到桌面 二.打开change logo&#xff0c;1.点击load image&#xff0c;选…...

微前端架构的持续集成与持续部署实践

在软件开发中&#xff0c;持续集成&#xff08;Continuous Integration, CI&#xff09;和持续部署&#xff08;Continuous Deployment, CD&#xff09;是实现高效、自动化软件交付的关键实践。微前端架构通过将应用拆分为多个自治的子应用&#xff0c;带来了开发和部署上的灵活…...

【STM32 FreeRTOS】事件标志组

事件标志组简介 事件标志组&#xff1a;用一个比特位来表示事件是否发生 事件标志组是一组事件标志位的集合&#xff0c;可以简单理解为事件标志组就是一个整数。 事件标志组的特点&#xff1a; 它的每一位表示一个事件&#xff08;高八位不算&#xff09;每一位事件的含义…...

【启动centos报错】另一个程序已锁定文件的一部分,进程无法访问,打不开磁盘.

启动centos报错 另一个程序已锁定文件的一部分&#xff0c;进程无法访问打不开磁盘“D:\Program2\CentOS\CentOS7\CentOS7.vmdk”或它所依赖的某个快照磁盘。模块“Disk”启动失败。未能启动虚拟机。解决方法 删除.lck文件...

基于YOLOv8-pose的手部关键点检测(3)- 实现实时手部关键点检测

目录 前言 1.扩大检测框区域 2.先检测手部&#xff0c;后检测手部关键点 3.正面视角检测 4.侧面视角检测 5.摄像头视角检测 6.遮挡视角检测 7.结论 前言 使用YOLOv8-m对图像进行手部检测&#xff0c;然后扩大检测框区域&#xff0c;并对该区域使用YOLOv8-s-pose使用关键…...

kylin系统永久关闭iptables

1 关闭iptables, 并且相关规则写入文件firewall.rules sudo iptables-save > /root/firewall.rules iptables -X iptables -t nat -F iptables -t nat -X iptables -t mangle -F iptables -t mangle -X iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P …...

写一个githubDemo

1.List组件 <template><div class"container"><!-- 展示用户列表 --><div class"row"><divv-show"info.users.length"v-for"(item, index) in info.users":key"item.id"><div class"…...

java入门-成员内部类和静态内部类的访问

&#xff08;一&#xff09;成员内部类 package InnerClass;import javax.print.attribute.standard.MediaSize;public class Outer {//2外部类中的成员private int age99;public static String a;public class Inner{//普通的成员内部类//1.1成员变量public String name;priva…...

ansible【自动化配置】(thirty day)

回顾 1、mysql和python &#xff08;1&#xff09;不需要执行mysql_ssl_rsa_setup &#xff08;2&#xff09;Change_master_to.不需要get public key 2、可以使用pymysql非交互的管理mysql &#xff08;1&#xff09;connpymysql.connect(host,user,password,database,prot) …...

GitOps Tekton+ArgoCD

GitOps 提供了一种基于 Git 的操作理念&#xff0c;而 Tekton 和 ArgoCD 分别作为 CI/CD 工具&#xff0c;共同实现了这一理念在 Kubernetes 集群中的应用 k8s只是jenkins 流水线中的一环&#xff0c;但是在tekton中&#xff0c;k8s是基础设施 工作流程&#xff1a; 代码提交…...

uniapp用户列表页面渲染、增删改查逻辑

<template><view class="container">...

力扣高频SQL 50题(基础版)第四十七题之1321.餐馆营业额变化增长

力扣高频SQL 50题&#xff08;基础版&#xff09;第四十七题 1321.餐馆营业额变化增长 题目说明 表: Customer ---------------------- | Column Name | Type | ---------------------- | customer_id | int | | name | varchar | | visited_on | date | | amount | …...

django中的MESSAGE组件

文章目录 message组件1 使用配置2 设置值3 读取值4 源码分析 message组件 1 使用配置 INSTALLED_APPS [# django.contrib.admin,# django.contrib.auth,# django.contrib.contenttypes,# django.contrib.sessions,django.contrib.messages,django.contrib.staticfiles,"…...

【JavaSE】解读Java中的toString方法

前言&#xff1a; 在Java中&#xff0c;toString方法来自java.lang.Object 类&#xff0c;然后所有对象都继承该Object 类。默认情况下&#xff0c;它的作用是返回对象的字符串表示形式。在实际开发中&#xff0c;重写 toString() 方法可以帮助我们以更易读的形式输出对象信息&…...

软件工程的核心原则:KISS, DRY, SOLID, YAGNI

软件工程的核心原则&#xff1a;KISS, DRY, SOLID, YAGNI — 深入解析与实践指南 引言 在软件开发的广阔领域中&#xff0c;原则和实践是构建高质量、可维护系统的基石。本文将深入探讨四个核心原则&#xff1a;KISS&#xff08;保持简单&#xff0c;愚蠢&#xff09;、DRY&a…...

Android 高通7.1系开机动画自动跟随系统方向旋转

本篇博客是记录自己解决开机动画与系统方向不一致方案代码&#xff0c;思路&#xff1a;在系统参数根目录自定义persist.sys.hwrotationxrd0来作为动画方向&#xff0c;当修改系统方向时同时修改这个参数&#xff0c;当系统启动加载动画时在根据这个来旋转动画方式以保证动画方…...

Sentinel入门与进阶:微服务流量控制的最佳实践 ( 三 )

5.配置持久化 目前的sentinel&#xff0c;无法满足我们生产环境的需求&#xff0c;因为一旦sentinel-dashboard发生重启&#xff0c;限流规则也会随之丢失。 sentinel规则的持久化: Sentinel自身就支持了多种不同的数据源来持久化规则配置&#xff0c;比如文件配置&#xff0…...

2021年上半年网络工程师考试上午真题

2021年上半年网络工程师考试上午真题 网络工程师历年真题含答案与解析 第 1 题 以下关于RISC和CISC计算机的叙述中&#xff0c;正确的是&#xff08; &#xff09;。 (A) RISC不采用流水线技术&#xff0c;CISC采用流水线技术(B) RISC使用复杂的指令&#xff0c;CISC使用简…...

SQL触发器的级联魔力:数据完整性的守护者

标题&#xff1a;SQL触发器的级联魔力&#xff1a;数据完整性的守护者 在SQL的丰富世界中&#xff0c;触发器&#xff08;Trigger&#xff09;是一种特殊的存储过程&#xff0c;它能够自动执行响应数据库中的数据修改事件。而级联操作&#xff08;Cascade&#xff09;则是触发…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

VisualXML全新升级 | 新增数据库编辑功能

VisualXML是一个功能强大的网络总线设计工具&#xff0c;专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑&#xff08;如DBC、LDF、ARXML、HEX等&#xff09;&#xff0c;并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...

【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道

文/法律实务观察组 在债务重组领域&#xff0c;专业机构的核心价值不仅在于减轻债务数字&#xff0c;更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明&#xff0c;合法债务优化需同步实现三重平衡&#xff1a; 法律刚性&#xff08;债…...

rknn toolkit2搭建和推理

安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 &#xff0c;不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源&#xff08;最常用&#xff09; conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...

stm32进入Infinite_Loop原因(因为有系统中断函数未自定义实现)

这是系统中断服务程序的默认处理汇编函数&#xff0c;如果我们没有定义实现某个中断函数&#xff0c;那么当stm32产生了该中断时&#xff0c;就会默认跑这里来了&#xff0c;所以我们打开了什么中断&#xff0c;一定要记得实现对应的系统中断函数&#xff0c;否则会进来一直循环…...

C++ 类基础:封装、继承、多态与多线程模板实现

前言 C 是一门强大的面向对象编程语言&#xff0c;而类&#xff08;Class&#xff09;作为其核心特性之一&#xff0c;是理解和使用 C 的关键。本文将深入探讨 C 类的基本特性&#xff0c;包括封装、继承和多态&#xff0c;同时讨论类中的权限控制&#xff0c;并展示如何使用类…...