【实践篇】Redis最强Java客户端(三)之Redisson 7种分布式锁使用指南

文章目录

  • 0. 前言
  • 1. Redisson 7种分布式锁使用指南
    • 1.1 简单锁:
    • 1.2 公平锁:
    • 1.3 可重入锁:
    • 1.4 红锁:
    • 1.5 读写锁:
    • 1.6 信号量:
    • 1.7 闭锁:
  • 2. Spring boot 集成Redisson 验证分布式锁
  • 3. 参考资料
  • 4. 源码地址
  • 5. Redis从入门到精通系列文章

在这里插入图片描述

0. 前言

前两章我们了解了《【实践篇】Redis最强Java客户端(一)之Redisson入门介绍》和《【实践篇】Redis最强Java客户端(二)之Redisson基础概念》本章第三章主要介绍Redisson的七种分布式锁,分别是简单锁、公平锁、可重入锁、红锁、读写锁、信号量和闭锁。下面是每种锁的基本概念、使用方法以及性能和并发控制方面的考虑。
在这里插入图片描述

1. Redisson 7种分布式锁使用指南

1.1 简单锁:

  • 简单锁是最基本的分布式锁,通过调用Redisson的getLock()方法来获取锁,并使用lock()unlock()方法来加锁和解锁。
  • 简单锁在性能方面表现良好,可以提供良好的并发控制。
RLock lock = redisson.getLock("myLock");
lock.lock();
try {// 执行需要加锁的业务逻辑
} finally {lock.unlock();
}

1.2 公平锁:

  • 公平锁是按照请求锁的顺序来获取锁的,先到先得。通过调用Redisson的getFairLock()方法来获取公平锁。
  • 性能和公平性控制:公平锁在性能方面相对较低,因为需要维护一个请求锁的队列来保证公平性。
RLock fairLock = redisson.getFairLock("myFairLock");
fairLock.lock();
try {// 执行需要加锁的业务逻辑
} finally {fairLock.unlock();
}

1.3 可重入锁:

  • 可重入锁是可以被同一个线程多次获取的锁。通过调用Redisson的getReentrantLock()方法来获取可重入锁。
  • 性能和重入控制:可重入锁在性能方面表现良好,并且可以通过计数器来控制锁的重入次数。
RReentrantLock reentrantLock = redisson.getReentrantLock("myReentrantLock");
reentrantLock.lock();
try {// 执行需要加锁的业务逻辑
} finally {reentrantLock.unlock();
}

1.4 红锁:

  • 红锁是在多个Redis实例上获取锁的一种机制,要求大多数Redis实例成功获取锁才算成功。通过调用Redisson的getRedLock()方法来获取红锁。
  • 性能和分布式锁控制:红锁在性能方面相对较低,因为需要在多个Redis实例之间进行同步。
RLock lock1 = redisson.getLock("lock1");
RLock lock2 = redisson.getLock("lock2");
RLock lock3 = redisson.getLock("lock3");
RedissonRedLock redLock = new RedissonRedLock(lock1, lock2, lock3);
redLock.lock();
try {// 执行需要加锁的业务逻辑
} finally {redLock.unlock();
}

1.5 读写锁:

  • 读写锁是同时支持读操作和写操作的锁。通过调用Redisson的getReadWriteLock()方法来获取读写锁。
  • 读写锁在读操作方面允许并发访问,但在写操作方面只允许一个线程访问。
RReadWriteLock readWriteLock = redisson.getReadWriteLock("myReadWriteLock");
RLock readLock = readWriteLock.readLock();
RLock writeLock = readWriteLock.writeLock();
readLock.lock();
try {// 执行需要读取的业务逻辑
} finally {readLock.unlock();
}writeLock.lock();
try {// 执行需要写入的业务逻辑
} finally {writeLock.unlock();
}

1.6 信号量:

  • 信号量是一种用于控制并发访问数量的锁。通过调用Redisson的getSemaphore()方法来获取信号量。
  • 信号量可以控制同时访问的线程数量,从而控制并发访问。
RSemaphore semaphore = redisson.getSemaphore("mySemaphore");
semaphore.acquire();
try {// 执行需要并发控制的业务逻辑
} finally {semaphore.release();
}

1.7 闭锁:

  • 闭锁是一种用于等待其他线程完成任务的同步工具。通过调用Redisson的getCountDownLatch()方法来获取闭锁。
  • 闭锁可以等待其他线程完成任务后再继续执行。
RCountDownLatch latch = redisson.getCountDownLatch("myLatch");
latch.trySetCount(1);// 等待其他线程完成任务
latch.await();// 执行需要等待的业务逻辑

以上是Redisson的七种分布式锁的基本概念、使用方法以及性能和并发控制方面的考虑。这些分布式锁可以在分布式环境中提供可靠的并发控制和资源访问解决方案。

2. Spring boot 集成Redisson 验证分布式锁

  1. 添加Redisson依赖
<dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.15.5</version>
</dependency>
  1. 配置Redisson连接
# Redisson连接信息
spring.redis.host=127.0.0.1
spring.redis.port=6379
# 其他Redisson配置(可选)
spring.redisson.config=classpath:redisson.yaml
  1. 创建Redisson配置文件(可选)
singleServerConfig:address: "redis://127.0.0.1:6379"
  1. 使用Redisson
package com.example.redissondemo.controller;import org.redisson.api.RLock;
import org.redisson.api.RReadWriteLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class LockController {@AutowiredRedissonClient redissonClient;@GetMapping("/lock")public void testLock() throws InterruptedException {// 1. 可重入锁(Reentrant Lock)RLock reentrantLock = redissonClient.getLock("reentrantLock");reentrantLock.lock();try {// critical section / business logic} finally {reentrantLock.unlock();}// 2. 公平锁(Fair Lock)RLock fairLock = redissonClient.getFairLock("fairLock");fairLock.lock();try {// critical section / business logic} finally {fairLock.unlock();}// 3. 读写锁(Read-Write Lock)RReadWriteLock rwLock = redissonClient.getReadWriteLock("rwLock");// 写锁rwLock.writeLock().lock();try {// write data} finally {rwLock.writeLock().unlock();}// 读锁rwLock.readLock().lock();try {// read data} finally {rwLock.readLock().unlock();}// 4. 联锁(MultiLock)RLock lock1 = redissonClient.getLock("lock1");RLock lock2 = redissonClient.getLock("lock2");RLock lock3 = redissonClient.getLock("lock3");RLock multiLock = redissonClient.getMultiLock(lock1, lock2, lock3);multiLock.lock();try {// combined business operations on lock1, lock2 and lock3} finally {multiLock.unlock();}// 5. 红锁(RedLock)RLock redLock = redissonClient.getRedLock(lock1, lock2, lock3);redLock.lock();try {// combined business operations on lock1, lock2 and lock3} finally {redLock.unlock();}// 6. 自动过期锁(Auto-expiring Lock)RLock autoExpireLock = redissonClient.getLock("autoExpireLock");autoExpireLock.lock();try {// critical section / business logic} finally {autoExpireLock.forceUnlock();}// 7. 闭锁(CountDownLatch Lock)RCountDownLatch latch = redissonClient.getCountDownLatch("latchLock");latch.trySetCount(1);latch.await();// to release the latchlatch.countDown();}
}

如果想自定义配置可以这样写,不依赖于Spring boot 注入bean 手动构造一个client 提交给Spring 容器

@java
public class RedissonConfig {@Value("${redisson.address}")private String addressUrl;@Value("${redisson.password}")private String password;@Beanpublic RedissonClient getRedisson(){Config config = new Config();config.useSingleServer().setAddress(addressUrl).setPassword(password);return Redisson.create(config);}
}

3. 参考资料

  1. Redisson官方网站:https://redisson.org/

  2. Redisson GitHub仓库:https://github.com/redisson/redisson

  3. redisson 参考文档 https://redisson.org/documentation.html

4. 源码地址

https://github.com/wangshuai67/icepip-springboot-action-examples
https://github.com/wangshuai67/Redis-Tutorial-2023

5. Redis从入门到精通系列文章

  • 《【Redis实践篇】使用Redisson 优雅实现项目实践过程中的5种场景》
  • 《Redis使用Lua脚本和Redisson来保证库存扣减中的原子性和一致性》
  • 《SpringBoot Redis 使用Lettuce和Jedis配置哨兵模式》
  • 《Redis【应用篇】之RedisTemplate基本操作》
  • 《Redis 从入门到精通【实践篇】之SpringBoot配置Redis多数据源》
  • 《Redis 从入门到精通【进阶篇】之三分钟了解Redis HyperLogLog 数据结构》
  • 《Redis 从入门到精通【进阶篇】之三分钟了解Redis地理位置数据结构GeoHash》
  • 《Redis 从入门到精通【进阶篇】之高可用哨兵机制(Redis Sentinel)详解》
  • 《Redis 从入门到精通【进阶篇】之redis主从复制详解》
  • 《Redis 从入门到精通【进阶篇】之Redis事务详解》
  • 《Redis从入门到精通【进阶篇】之对象机制详解》
  • 《Redis从入门到精通【进阶篇】之消息传递发布订阅模式详解》
  • 《Redis从入门到精通【进阶篇】之持久化 AOF详解》
  • 《Redis从入门到精通【进阶篇】之持久化RDB详解》
  • 《Redis从入门到精通【高阶篇】之底层数据结构字典(Dictionary)详解》
  • 《Redis从入门到精通【高阶篇】之底层数据结构快表QuickList详解》
  • 《Redis从入门到精通【高阶篇】之底层数据结构简单动态字符串(SDS)详解》
  • 《Redis从入门到精通【高阶篇】之底层数据结构压缩列表(ZipList)详解》
  • 《Redis从入门到精通【进阶篇】之数据类型Stream详解和使用示例》
    在这里插入图片描述大家好,我是冰点,今天的【实践篇】Redis最强Java客户端(三)之Redisson 7种分布式锁使用指南,全部内容就是这些。如果你有疑问或见解可以在评论区留言。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32 SPI对存储芯片发送写是能命令后一直忙等待

我采用CUBE配置的SPI外设&#xff0c;对NSS引脚选择了硬件输出&#xff0c;这种方式对读取命令没有影响&#xff0c;但是对写命令有&#xff0c;当我发送写是能命令后&#xff0c;读取状态寄存器的值一直都是忙&#xff0c;我猜测这可能是硬件控制NSS引脚后&#xff0c;对于HAL…

Allegro166版本如何在颜色管理器中实时显示层面操作指导

Allegro166版本如何在颜色管理器中实时显示层面操作指导 在用Allegro166进行PCB设计的时候,需要在颜色管理器中频繁的开关层面。但是166不像172一样在颜色管理器中可以实时的开关层面,如下图 需要打开Board Geometry/Soldermask_top层,首先需要勾选这个层面,再点击Apply即…

算法训练营day42|动态规划 part04:0-1背包 (01背包问题基础(两种解决方案)、LeetCode 416.分割等和子集)

文章目录 01背包----二维dp数组01背包----滚动数组416.分割等和子集(求背包能不能装满)思路分析背包解法思考总结 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求解将哪些物品装入背…

VS编译.cu文件源文件无法打开matrix.h和mex.h问题

配置好cu和VS相关库文件后CUDA程序仍然报错&#xff1a;无法打开matrix.h和mex.h&#xff0c;解决办法&#xff1a; &#xff08;1&#xff09;这两个头文件是matlab中的&#xff0c;可能无法直接在VS中调用&#xff0c;可以通过添加外部依赖项的方法将matlab中的头文件的文件路…

JWT一篇通

JWT 是什么&#xff1f; JWT&#xff08;JSON Web Token&#xff09;是一种开放的标准&#xff0c;标准的编号是RFC7591。用于在不同实体之间安全地传输信息。它是基于 JSON 编码的令牌。 JWT 的组成 JWT由三个部分组成&#xff1a;头部&#xff08;Header&#xff09;、载荷…

雅思口语 23九月换题季最新考题答案

目录 Helping others 1.Do you usually help people around you? 2.How do you help people around you,such as neighbours,family and friends? 3.Do your parents teach you how to help others? 4.Did your parents help you a lot when you were young? 5.What …

micro python 编译流程和方法,以及一部分问题解决

micro python官网 https://micropython.org/ 点击 点击对应的芯片&#xff0c;我这里是ESP32-S3 点击到git 到esp32目录下 按照指引下载安装ESP-IDF IDF版本查看连接如下&#xff1a; https://docs.espressif.com/projects/esp-idf/en/latest/esp32/versions.html 我这里选择…

Maven安装与配置

一.下载 1.可以从官方下载 二.安装 1. 把maven压缩包解压到一个没有中文&#xff0c;空格或其他特殊字符的文件夹内即可使用。 2.配置环境变量MAVEN_HOME 3.在path环境变量中添加&#xff1a;%MAVEN_HOME%\bin 4.测试mvn -version 出现版本号就意味着配置成功了 三.配置…

web UI自动化介绍

文章目录 一、web UI自动化介绍1.1 执行UI自动化测试前提1.2 Selenium介绍以及知识点梳理 二、Selenium 学习2.1 基础2.1.1 环境安装与基础使用2.1.2 web浏览器控制2.1.3 常见控件的八大定位方式2.1.3.1 八大定位方式介绍2.1.3.2 NAME、ID定位2.1.3.3 css_selector定位2.1.3.4 …

工作游戏时mfc140u.dll丢失的解决方法,哪个方法可快速修复mfc140u.dll问题

在 Windows 操作系统中&#xff0c;mfc140u.dll 文件是非常重要的一个组件&#xff0c;许多基于 MFC&#xff08;Microsoft Foundation Classes&#xff09;的程序都需要依赖这个文件。然而&#xff0c;有些用户在运行这些程序时可能会遇到mfc140u.dll丢失的问题&#xff0c;导…

系统架构设计师(第二版)学习笔记----系统架构概述

【原文链接】系统架构设计师&#xff08;第二版&#xff09;学习笔记----系统架构概述 文章目录 一、系统架构的定义与发展历程1.1 架构的定义1.2 架构设计的作用1.3 架构设计产生的背景1.4 软件架构的发展历程1.5 模块化开发方法1.6 模块法方法分解模块遵循的原则1.7 软件工程…

学习SpringMvc第二战之【SpringMVC之综合案例】

目录 一. 参数传递 1.前期准备工作&#xff08;替换pom.xml中的部分依赖&#xff09; 1.1将log4j替换成为slf4j(将打印语句替换成为日志文件输出结果) 2.正式操作 1.基础传参 1.1创建方法&#xff0c;用于验证传参 1.2构建界面回显 1.3设置访问路径&#xff08;localho…