【实践篇】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.mzph.cn/news/74276.shtml

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

相关文章

LeetCode 49题: 字母异位词分组

题目 给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs ["eat", "tea", "tan", "ate", "nat&qu…

Linux中的软件管家——yum

目录 ​编辑 一&#xff0c;软件安装的方式 二&#xff0c;对yum的介绍 1.yum的作用 2&#xff0c;yum的库 三&#xff0c;yum下载软件的操作 1.yumlist 2.yuminstall 3.yumremove 四&#xff0c;yum源的转换 一&#xff0c;软件安装的方式 软件安装的方式大概分为三种…

【韩顺平】Linux基础

目录 1.网络连接三种方式 1.1 桥接模式&#xff1a;虚拟系统可以和外部系统通讯&#xff0c;但是容易造成IP冲突【1-225】 1.2 NAT模式&#xff1a;网络地址转换模式。虚拟系统可以和外部系统通讯&#xff0c;不造成IP冲突。 1.3 主机模式&#xff1a;独立的系统。 2.虚拟机…

C# PSO 粒子群优化算法 遗传算法 随机算法 求解复杂方程的最大、最小值

复杂方程可以自己定义&#xff0c;以下是看别人的题目&#xff0c;然后自己来做 以下是计算结果 private void GetMinResult(out double resultX1, out double min){double x1, result;Random random1 new Random(DateTime.Now.Millisecond* DateTime.Now.Second);min 99999…

C语言柔性数组详解:让你的程序更灵活

柔性数组 一、前言二、柔性数组的用法三、柔性数组的内存分布四、柔性数组的优势五、总结 一、前言 仔细观察下面的代码&#xff0c;有没有看出哪里不对劲&#xff1f; struct S {int i;double d;char c;int arr[]; };还有另外一种写法&#xff1a; struct S {int i;double …

软件与系统安全复习

软件与系统安全复习 课程复习内容 其中 软件与系统安全基础 威胁模型 对于影响系统安全的所有信息的结构化表示 本质上&#xff0c;是从安全的视角解读系统与其环境 用于理解攻击者 什么可信、什么不可信攻击者的动机、资源、能力&#xff1b;攻击造成的影响 具体场景…

java.lang.NullPointerException at Com.su.test.MyTest.test01

还不太懂原理,解决办法就是在测试类注解上添加 RunWith(SpringJUnit4ClassRunner.class)或者RunWith(SpringRunner.class) 附上链接:RunWith(SpringRunner.class)和RunWith(SpringJUnit4ClassRunner.class)的区别_来老铁干了这碗代码的博客-CSDN博客 test测试报NullPointerEx…

05 CNN 猴子类别检测

一、数据集下载 kaggle数据集[10 monkey] 二、数据集准备 2.1 指定路径 from tensorflow import keras import tensorflow as tf import numpy as np import pandas as pd import matplotlib.pyplot as plttrain_dir /newdisk/darren_pty/CNN/ten_monkey/training/ valid_d…

【C】【C++】可变参数、不定参函数的使用

文章目录 1. C 语言1.1 可变宏函数1.2 可变函数 2. C 1. C 语言 c语言中的可变参数写法&#xff1a;... 1.1 可变宏函数 以日志举例&#xff0c;我们写入日志时只需要输入关键信息&#xff0c;行号文件等由宏函数补全这其中&#xff0c;我们需要输入的信息是格式不定的&#x…

实现Spring Boot集成MyBatis

引言 在Java开发中&#xff0c;Spring Boot和MyBatis是非常常用的框架。Spring Boot是一个快速开发应用程序的框架&#xff0c;而MyBatis是一个持久化框架&#xff0c;可以方便地操作数据库。本文将介绍如何使用Idea集成Spring Boot和MyBatis&#xff0c;并创建一个简单的示例…

App 出海实践:Google Play 结算系统

作者&#xff1a;业志陈 现如今&#xff0c;App 出海热度不减&#xff0c;是很多公司和个人开发者选择的一个市场方向。App 为了实现盈利&#xff0c;除了接入广告这种最常见的变现方式外&#xff0c;就是通过提供各类虚拟商品或者是会员服务来吸引用户付费了&#xff0c;此时 …

了解被测系统(二)接入链路--包括域名解析和Nginx代理

目录 一、接入链路示例 二、域名解析过程 1、相关概念 1.1、域的结构 1.2、DNS是什么&#xff1f; 1.3、DNS根域名服务器 1.4、顶级域名服务器 1.5、权威域名服务器 2、域名解析过程 2.1、检查Hosts文件 2.2、检查本地DNS缓存 2.3、DNS解析--本地DNS服务器 2.4、D…

后端SpringBoot+前端Vue前后端分离的项目(二)

前言&#xff1a;完成一个列表&#xff0c;实现表头的切换&#xff0c;字段的筛选&#xff0c;排序&#xff0c;分页功能。 目录 一、数据库表的设计 ​编辑二、后端实现 环境配置 model层 mapper层 service层 service层单元测试 controller层 三、前端实现 interface接…

IP和MAC的作用区别

在 IP 地址的上一行是 link/ether fa:16:3e:c7:79:75 brd ff:ff:ff:ff:ff:ff&#xff0c;这个被称为 MAC 地址&#xff0c;是一个网卡的物理地址&#xff0c;用十六进制&#xff0c;6 个 byte 表示。 一个网络包要从一个地方传到另一个地方&#xff0c;除了要有确定的地址&…

合宙Air724UG LuatOS-Air LVGL API控件-滑动条 (Slider)

滑动条 (Slider) 滑动条看起来和进度条是有些是有些像&#xff0c;但不同的是滑动条可以进行数值选择。 示例代码 -- 回调函数 slider_event_cb function(obj, event)if event lvgl.EVENT_VALUE_CHANGED then local val (lvgl.slider_get_value(obj) or "0")..&…

在PHP8中遍历数组-PHP8知识详解

所谓遍历数组就是把数组中的变量值读取出来。遍历数组中的所有元素对程序员来说是经常使用的操作&#xff0c;通过遍历数组可以完成数组元素的查询工作。 这好比你去商场买东西一样&#xff0c;要买什么东西&#xff0c;就去该区域浏览一遍&#xff0c;以便找出适合自己的产品…

Ubuntu 18.04安装搜狗输入法后无法显示中文

前置 Ubuntu系统&#xff1a; Ubuntu 18.04 LTS搜狗输入法版本&#xff1a; sogoupinyin_4.2.1.145_amd64.deb 搜狗输入法Linux官方安装指导&#xff1a;https://shurufa.sogou.com/linux/guide 问题 按照官方文档安装后&#xff0c;发现fcitx管理已经添加搜狗输入法&#…

【JavaEE】_CSS常用属性值

目录 1. 字体属性 1.1 设置字体家族 font-family 1.2 设置字体大小 font-size 1.3 设置字体粗细 font-weight 1.4 设置字体倾斜 font-style 2. 文本属性 2.1 设置文本颜色 color 2.2 文本对齐 text-align 2.3 文本装饰 text-decoration 2.4 文本缩进 text-indent 2.…

合宙Air724UG LuatOS-Air LVGL API控件-图片 (Image)

图片 (Image) 图片IMG是用于显示图像的基本对象类型&#xff0c;图像来源可以是文件&#xff0c;或者定义的符号。 示例代码 -- 创建图片控件 img lvgl.img_create(lvgl.scr_act(), nil) -- 设置图片显示的图像 lvgl.img_set_src(img, "/lua/luatos.png") -- 图片…

【LeetCode-面试经典150题-day20】

目录 70.爬楼梯 198.打家劫舍 139.单词拆分 322.零钱兑换 300.最长递增子序列 70.爬楼梯 题意&#xff1a; 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 提示&#xff1a; 1 < n < …