Redisson 分布式锁可重入的原理

目录

[1. 使用 Redis 实现分布式锁存在的问题](#1. 使用 Redis 实现分布式锁存在的问题)

[2. Redisson 的分布式锁解决不可重入问题的原理](#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 脚本
相关推荐
Rain的Java大神之路4 小时前
介绍一下分布式事务
java·分布式·后端·spring·spring cloud·架构·springcloud
做一个AK梦12 小时前
Redis 深入浅出
java·数据库·redis·缓存
ruleslol12 小时前
Redis 雪崩与服务降级
数据库·redis
Java牛马14 小时前
Caffeine 缓存及其应用相关总结
java·redis·缓存·caffeine·数据一致性·本地缓存
李可以量化16 小时前
Redis 从了解到精通(三)上:量化交易场景下的数据备份与安全配置
redis·python·安全·qmt·ptrade
Patrick在香港16 小时前
Python asyncio + aiohttp 并发抓取实战:把同步爬虫改造成 3 倍吞吐量的并发管道
redis·爬虫·python
大菠萝爱上小西瓜17 小时前
【大数据实战】Spark 2.2.2 完全分布式集群搭建
大数据·分布式·spark
肠畔码农17 小时前
深度解析 RocketMQ 消费端限流与重平衡(Rebalance):分布式队列分配与流控防雪崩本质
分布式·rocketmq
海兰18 小时前
【 Kafka进阶3】Apache Kafka 分布式事件流平台:架构原理与微服务解耦机制简要分析
分布式·架构·kafka
2602_9599609218 小时前
电商场景Java面试:Spring Boot、JVM、Redis、Kafka、微服务与分布式事务考点解析——谢飞机的作死面试记
java·jvm·spring boot·redis·面试题