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

深度剖析 Redisson 分布式锁:原理、实现与应用实践

文章目录

    • 写在文章开头
    • 详解Redisson 分布式锁使用和实现
      • 前置准备工作
      • 分布式锁的基本使用
      • 公平锁的使用
      • 联锁的使用
      • 读写锁基本使用
    • 常见问题
      • Redisson和Jedis有什么区别
      • redisson如何实现分布式锁
      • redisson如何实现分布式锁的可重入
      • redisson如何实现公平锁
      • Redisson的watchdog机制是什么?如何实现的
      • 什么是RedLock,其实现思路是什么
      • Redisson 中为什么要废弃 RedLock
    • 参考

写在文章开头

在当今分布式系统大行其道的技术领域,如何有效协调多个节点之间对共享资源的访问,成了开发者们必须攻克的一道难关。分布式锁,作为解决这一难题的关键技术手段,正发挥着举足轻重的作用。
在众多分布式锁的实现方案中,Redisson 以其强大的功能、出色的性能和极高的易用性脱颖而出,成为了开发者们的得力助手。Redisson 不仅仅是一个简单的分布式锁工具,它更像是一套完整的分布式协调框架,提供了丰富多样的分布式对象和服务,极大地简化了分布式系统的开发过程。

详解Redisson 分布式锁使用和实现

前置准备工作

使用redisson时我们优先需要引入其依赖:

 <dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.23.5</version></dependency>

然后配置redis基本配置信息,这里笔者以单体架构为例给出redis的配置示例:

spring.redis.host=localhost
spring.redis.port=6379

分布式锁的基本使用

RLock继承了JUC包下的Lock接口,所以使用起来和JUC包下的几个lock类似,这里我们也给出相应的基本代码示例:

CountDownLatch countDownLatch = new CountDownLatch(2);//声明一把分布式锁RLock lock = redissonClient.getLock("lock");new Thread(() -> {try {//上锁lock.lock();log.info("lock lock success");ThreadUtil.sleep(1, TimeUnit.MINUTES);countDownLatch.countDown();} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}).start();new Thread(() -> {try {//休眠5s让上一个线程先取锁ThreadUtil.sleep(5, TimeUnit.SECONDS);//上锁if (lock.tryLock()) {log.info("try  lock success");//成功后执行业务逻辑然后释放锁ThreadUtil.sleep(1, TimeUnit.MINUTES);lock.unlock();} else {log.info("try lock fail");}countDownLatch.countDown();} catch (Exception e) {e.printStackTrace();}}).start();countDownLatch.await();

对应的输出结果如下,可以看到第一个线程基于redisson上锁成功后,第二个线程就无法上锁了:

在这里插入图片描述

公平锁的使用

默认情况下redisson分布式锁是非公平的,即任意时刻任意一个请求都可以在锁释放后争抢分布式锁,对此redisson给出了公平锁的实现,如下代码所示,笔者通过getFairLock声明一把公平锁,让声明5个线程进行争抢:

int size = 5;//声明分布式锁RLock reentrantLock = redissonClient.getFairLock("lock");//创建线程池ExecutorService threadPool = Executors.newFixedThreadPool(size);CountDownLatch countDownLatch = new CountDownLatch(size);//遍历线程池,让池内的线程争抢分布式锁for (int i = 0; i < size; i++) {threadPool.submit(() -> {try {reentrantLock.lock();log.info("reentrantLock.lock success");} catch (Exception e) {log.error("reentrantLock.lock error", e);} finally {reentrantLock.unlock();log.info("reentrantLock.unlock success");countDownLatch.countDown();}});}countDownLatch.await();

可以看到,笔者通过调试的方式顺序让线程争抢分布式锁,最终输出结果也是按照先来后到的方式获取锁和释放锁:

在这里插入图片描述

联锁的使用

联锁顾名思义,只有一次性获取多把锁之后才能算成功,对应的代码示例如下:

RLock lock1 = redissonClient.getFairLock

http://www.mrgr.cn/news/89935.html

相关文章:

  • 使用React和Material-UI构建TODO应用的前端UI
  • MFC 创建Ribbon样式窗口
  • java.布尔类型
  • Xcode :给模拟器 创建桌面 快捷方式
  • Ubuntu Server挂载AWS S3成一个本地文件夹
  • 神经网络
  • mysql 学习11 事务,事务简介,事务操作,事务四大特性,并发事务问题,事务隔离级别
  • 深入探究 C++17 std::is_invocable
  • 计算机毕业设计Tensorflow+LSTM空气质量监测及预测系统 天气预测系统 Spark Hadoop 深度学习 机器学习 人工智能
  • 虚拟局域网之详解(Detailed Explanation of Virtual Local Area Network)
  • 参数映射服务完整解决方案
  • A股level2高频数据分析20250205
  • STC51案例操作
  • “公路养护新利器!公路 AI 智慧巡检系统
  • cursor指令工具
  • JavaScript系列(66)--类型系统实现详解
  • 题海拾贝:【高精度】减法
  • 驱动开发系列34 - Linux Graphics Intel 动态显存技术的实现
  • 数据结构:算法复杂度
  • DeepSeek-R1论文细节时间线梳理
  • 0002-课前准备和课程基础
  • 开源项目介绍-词云生成
  • 源路由 | 源路由网桥 / 生成树网桥
  • 【GoLang】切片的面试知识点
  • jakarta EE学习笔记-个人笔记
  • python:如何播放 .spx 声音文件