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

news/2025/2/9 12:31:09/

文章目录

    • 写在文章开头
    • 详解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.ppmy.cn/news/1570576.html

相关文章

Elasticsearch 高级技巧

Elasticsearch 高级技巧 1. 优化查询 使用过滤器&#xff08;Filter&#xff09;而不是查询&#xff08;Query&#xff09; Elasticsearch 中的查询分为两种主要类型&#xff1a;查询&#xff08;Query&#xff09; 和 过滤器&#xff08;Filter&#xff09;。查询会计算文档…

【深度学习入门_机器学习理论】决策树(Decision Tree)

本部分主要为机器学习理论入门_决策树算法&#xff0c;书籍参考 “ 统计学习方法&#xff08;第二版&#xff09;”。 学习目标&#xff1a; 熟悉决策树基础知识&#xff1a;树、熵、信息增益、基尼指数&#xff1b;熟悉决策树构建步骤&#xff1b;熟悉3种典型决策树算法&…

数据中台是什么?:架构演进、业务整合、方向演进

文章目录 1. 引言2. 数据中台的概念与沿革2.1 概念定义2.2 历史沿革 3. 数据中台的架构组成与关键技术要素解析3.1 架构组成3.2 关键技术要素 4. 数据中台与其他平台的对比详细解析 5. 综合案例&#xff1a;金融行业数据中台落地实践5.1 背景5.2 解决方案5.3 成果与价值 6. 方向…

Nginx 配置 SSL(HTTPS)详解

Nginx作为一款高性能的HTTP和反向代理服务器&#xff0c;自然支持SSL/TLS加密通信。本文将详细介绍如何在Nginx中配置SSL&#xff0c;实现HTTPS的访问。 随着互联网安全性的日益重要&#xff0c;HTTPS协议逐渐成为网站加密通信的标配。Nginx作为一款高性能的HTTP和反向代理服务…

【单层神经网络】基于MXNet库简化实现线性回归

写在前面 同最开始的两篇文章 完整程序及注释 导入使用的库# 基本 from mxnet import autograd, nd, gluon # 模型、网络 from mxnet.gluon import nn from mxnet import init # 学习 from mxnet.gluon import loss as gloss # 数据集 from mxnet.gluon…

服务器重启后报Predis_ServerException: Client sent AUTH, but no password is set

Redis问题产生后,处理办法 2025/02/08 11:21:43 [error] [exception.Predis_ServerException] Predis_ServerException: Client sent AUTH, but no password is set in /www/wwwroot/er/protected/extensions/redis/Predis.php:573 Stack trace: #0 /www/wwwroot/er/protected…

Vue3 ref属性

ref() 接受一个内部值&#xff0c;返回一个响应式的、可更改的 ref 对象&#xff0c;此对象只有一个指向其内部值的属性 .value。 function ref<T>(value: T): Ref<UnwrapRef<T>>interface Ref<T> {value: T } 详细信息 ref 对象是可更改的&#xff…

修剪二叉搜索树(力扣669)

这道题还是比较复杂&#xff0c;在递归上与之前写过的二叉树的题目都有所不同。如果当前递归到的子树的父节点不在范围中&#xff0c;我们根据节点数值的大小选择进行左递归还是右递归。为什么找到了不满足要求的节点之后&#xff0c;还要进行递归呢&#xff1f;因为该不满足要…