Redisson 分布式锁可重入的原理

目录

1. 使用 Redis 实现分布式锁存在的问题

2. Redisson 的分布式锁解决不可重入问题的原理


1. 使用 Redis 实现分布式锁存在的问题

  • 不可重入:同一个线程无法两次 / 多次获取锁
  • 举例
    • method1 执行需要获取锁
    • method2 执行也需要(同一把)锁
    • 如果 method1 中调用了 method2,就会出现死锁的情况
    • method1 执行的过程是同一个线程,但是锁无法识别,则无法重入

2. Redisson 的分布式锁解决不可重入问题的原理

  • 原理
    • 判断是否可重入:记录占有锁的当前线程和想要获取锁的线程是否是同一个线程,如果是则获取锁成功
    • 获取锁
      • 判断锁是否是自己的
      • 在 hash 的 value 中记录锁总共被(同一线程)获取的次数,获取一次,value + 1,且要重置锁的有效期,给重入的方法执行预留充足时间
    • 释放锁:判断锁的重入次数(即 value)是否为 0
      • 如果为 0,说明重入锁的层数到了最外层(method1),可以执行释放锁的逻辑
      • 如果 value > 0,说明还没有到最外层(还在执行 method2),则不能释放锁,而是将 value - 1,表示跳到外面一层,且需要重置锁的有效期
  • 核心思想:利用 Redis 中的 hash 结构,记录获取锁的线程和重入次数

  • 获取锁和释放锁的原子性:Lua 脚本

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

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

相关文章

Backtrader 文档学习-Order OCO orders

Backtrader 文档学习-Order OCO orders 主要是可以使用订单组的管理策略,使用订单组策略,则一组订单中,有一个符合条件的订单成交,订单组中其他的订单就自动被取消。 1.概述 V1.9.36.116 版本交互式代理支持StopTrail、StopTra…

初探二分法

推荐阅读 智能化校园:深入探讨云端管理系统设计与实现(一) 智能化校园:深入探讨云端管理系统设计与实现(二) 文章目录 推荐阅读题目解法一解法二 题目 题目:给定一个 n 个元素有序的&#xff0…

图像旋转角度计算并旋转

#!/usr/bin/python3 # -*- coding: utf-8 -*- import cv2 import numpy as np import timedef Rotate(img, angle0.0,fill0):"""旋转:param img:待旋转图像:param angle: 旋转角度:param fill:填充方式,默认0黑色填充:return: img: 旋转后…

[已解决]504 Gateway Time-out 网关超时

文章目录 问题:504 Gateway Time-out 504 Gateway Time-out 网关超时思路解决 问题:504 Gateway Time-out 504 Gateway Time-out 网关超时 思路 网上的常规思路是修改nginx配置文件,增加请求执行时间,试过没有用 keepalive_timeout 600; fastcgi_con…

凭服务出圈的海底捞,竟然在这件事上也很卷

1月9日,法大大与企业绿色发展研究院联合发布了《2023年签约减碳与低碳办公白皮书》(点击阅读及下载:法大大推出“签约减碳”年度账单,引领低碳办公新风潮),该白皮书基于《低碳办公评价》标准倡导的创新减碳…

qt-C++笔记之命令行编译程序,特别是使用Q_OBJECT宏包含了moc(Meta-Object Compiler)的情况

qt-C笔记之命令行编译程序,特别是使用Q_OBJECT宏包含了moc(Meta-Object Compiler)的情况 —— 杭州 2024-01-24 code review! 文章目录 qt-C笔记之命令行编译程序,特别是使用Q_OBJECT宏包含了moc(Meta-Object Compiler)的情况1.问题现象:q…

eNSP学习——交换机配置Trunk接口

目录 原理概述 实验内容 实验目的 实验步骤 实验拓扑 实验编址: 试验步骤 基本配置 创建VLAN,配置Access接口 配置Trunk接口 思考题 原理概述 在以太网中,通过划分VLAN来隔离广播域和增强网络通信的安全性。以太网通常由多台交换机组…

架构师之路(十五)计算机网络(网络层协议)

前置知识(了解):计算机基础。 作为架构师,我们所设计的系统很少为单机系统,因此有必要了解计算机和计算机之间是怎么联系的。局域网的集群和混合云的网络有啥区别。系统交互的时候网络会存在什么瓶颈。 ARP协议 地址解…

水雾发生器走过路过不要错过

一、细水雾灭火机理与结构特征如下: 瓦斯输送管道细水雾发生器,是根据细水雾灭火机理及煤矿瓦斯的燃烧特性而进行研制的。其灭火机理: 一是冷却,细水雾颗粒容易气化,大量吸热,迅速降温,终止燃烧…

【JavaWeb】会话管理 cookie session 三大域对象总结

文章目录 会话管理一、Cookie1.1 Cookie的使用1.2 Cookie的时效性1.3 Cookie的提交路径 二、Session2.1 HttpSession的使用2.2 HttpSession时效性 三、三大域对象3.1 域对象概述3.2 域对象的使用 总结 会话管理 HTTP是无状态协议 无状态就是不保存状态,即无状态协议(stateless)…

解决Sublime Text V3.2.2中文乱码问题

目录 中文乱码出现情形通过安装插件来解决乱码问题 中文乱码出现情形 打开一个中文txt文件,显示乱码,在File->Reopen With Encoding里面找不到支持简体中文正常显示的编码选项。 通过安装插件来解决乱码问题 安装Package Control插件 打开Tool->…

【数据结构与算法】栈(Stack)之 浅谈数组和链表实现栈各自的优缺点

文章目录 1.栈介绍2. 哪种结构实现栈会更优?3.栈代码实现(C语言) 往期相关文章: 线性表之顺序表线性表之链表 1.栈介绍 栈是一种特殊的线性表,只允许在栈顶(Top)进行插入和删除元素操作&#…

【项目日记(四)】第一层: 线程缓存的具体实现

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:项目日记-高并发内存池⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你做项目   🔝🔝 开发环境: Visual Studio 2022 项目日…

Unity中URP下获取每一个额外灯数据

文章目录 前言一、我们先来看一下 SimpleLit 中的调用二、获取额外灯索引1、非移动平台2、非GLES平台3、大多数平台 三、获取额外灯数据 前言 在上一篇文章中,我们知道了URP下是怎么获取额外灯数量的。 Unity中URP下获取额外灯数量 在这篇文章中,我们…

场内基金出货是什么意思?出货和洗盘有什么区别?

场内基金出货是股市中常见的一种操作策略,指股市中的投资大户或者机构大量或者批次买入某只股票,并散发利好该股票的消息,导致该股票在短时间内股价升高,从而吸引投资散户购买该股票。等到股价上升到一定的阶段时,庄家…

nextjs中beforePopState使用

在某些情况下,希望监听popstate并在路由器对其进行操作之前执行某些操作。可以使用beforePopState。 在Next.js中,beforePopState是一个可选的生命周期函数,用于在浏览器的历史记录发生更改之前执行一些操作。具体来说,beforePopS…

两千字讲明白java中instanceof关键字的使用!

写在开头 在过往的内容中,我们讲了不少的Java关键字,比如final、static、this、super等等,Java中的关键字非常之多,下图是整理的关键字集合 而我们今天要学习的就是其中的instanceof关键字! instanceof的定义 instanc…

k8s安全机制

安全机制:k8s的安全机制,分布式集群管理工具,就是容器编排。 安全机制的核心:API SERVER作为整个集群内部通信的中介,也是外控控制的入口。所有的安全机制都是围绕api server来进行设计: 请求api资源&#…

数据结构·单链表

不可否认的是,前几节我们讲解的顺序表存在一下几点问题: 1. 中间、头部的插入和删除,需要移动一整串数据,时间复杂度O(N) 2. 增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗 3. 增容一般是2倍的增…

MySQL安装及可视化工具SQLyog下载

编程如画,我是panda! 最近学习Web开发的时候要用到数据库,一开始下载的ZIP版本的,还得修改配置文件,挺麻烦的,后来发现可以直接使用msi版的安装包疯狂next,所以就出一期教程。 前言 MySQL 是一…
最新文章