分布式锁框架-Redisson

news2024/12/28 4:39:54

分布式锁框架-Redisson

  • 一、Redisson介绍
  • 二、在SpringBoot中使用Redisson
  • 三、Redisson工作原理
  • 四、Redisson使用扩展
    • 4.1、Redisson单机连接
    • 4.2、Redisson集群连接
    • 4.3、Redisson主从连接
  • 五、分布式锁总结
    • 5.1、分布式锁特点
    • 5.2、锁的分类
    • 5.3、Redission的使用

基于Redis+看门狗机制的分布式锁框架

一、Redisson介绍

官网链接:https://redisson.org/

Redisson是架设在Redis基础上的一个Java驻内存数据网格(In-Memory Data Grid)。

Redisson在基于NIO的Netty框架上,充分的利用了Redis键值数据库提供的一系列优势,在Java实用工具包中常用接口的基础上,为使用者提供了一系列具有分布式特性的常用工具类。使得原本作为协调单机多线程并发程序的工具包获得了协调分布式多机多线程并发系统的能力,大大降低了设计和研发大规模分布式系统的难度。同时结合各富特色的分布式服务,更进一步简化了分布式环境中程序相互之间的协作。

主要有以下几大特性:
云Redis管理、多样Redis配置支持、丰富连接方式、分布式对象、分布式集合、分布式锁、分布式服务、多种序列化方式、三方框架整合、完善工具等

  1. 支持云托管服务模式(同时支持亚马逊云的ElastiCache Redis和微软云的Azure Redis Cache):
  • 自动发现主节点变化
  1. 支持Redis集群模式(同时支持亚马逊云的ElastiCache Redis Cluster和微软云的Azure Redis Cache):
  • 自动发现主从节点
  • 自动更新状态和组态拓扑
  • 自动发现槽的变化
  1. 支持Redis哨兵模式:
  • 自动发现主、从和哨兵节点
  • 自动更新状态和组态拓扑
  1. 支持Redis主从模式
  2. 支持Redis单节模式
  3. 多节点模式均支持读写分离:从读主写,主读主写,主从混读主写
  4. 所有对象和接口均支持异步操作
  5. 自行管理的弹性异步连接池
  6. 所有操作线程安全
  7. 支持LUA脚本
  8. 提供分布式对象
    通用对象桶(Object Bucket)、二进制流(Binary Stream)、地理空间对象桶(Geospatial Bucket)、BitSet、原子整长形(AtomicLong)、原子双精度浮点数(AtomicDouble)、话题(订阅分发)、布隆过滤器(Bloom Filter)和基数估计算法(HyperLogLog)
  9. 提供分布式集合
    映射(Map)、多值映射(Multimap)、集(Set)、列表(List)、有序集(SortedSet)、计分排序集(ScoredSortedSet)、字典排序集(LexSortedSet)、列队(Queue)、双端队列(Deque)、阻塞队列(Blocking Queue)、有界阻塞列队(Bounded Blocking Queue)、阻塞双端列队(Blocking Deque)、阻塞公平列队(Blocking Fair Queue)、延迟列队(Delayed Queue)、优先队列(Priority Queue)和优先双端队列(Priority Deque)
  10. 提供分布式锁和同步器
    可重入锁(Reentrant Lock)、公平锁(Fair Lock)、联锁(MultiLock)、红锁(RedLock)、读写锁(ReadWriteLock)、信号量(Semaphore)、可过期性信号量(PermitExpirableSemaphore)和闭锁(CountDownLatch)
  11. 提供分布式服务
    分布式远程服务(Remote Service, RPC)、分布式实时对象(Live Object)服务、分布式执行服务(Executor Service)、分布式调度任务服务(Scheduler Service)和分布式映射归纳服务(MapReduce)
    13.支持Spring框架
  12. 提供Spring Cache集成
  13. 提供Hibernate Cache集成
  14. 提供JCache实现
  15. 提供Tomcat Session Manager
  16. 提供Spring Session集成
  17. 支持异步流方式执行操作
  18. 支持Redis管道操作(批量执行)
  19. 支持安卓(Andriod)系统
  20. 支持断线自动重连
  21. 支持命令发送失败自动重试
  22. 支持OSGi
  23. 支持采用多种方式自动序列化和反序列化(Jackson JSON,Avro,Smile,CBOR,MsgPack,Kryo,FST,LZ4,Snappy和JDK序列化)
  24. 超过1000个单元测试

二、在SpringBoot中使用Redisson

  • 添加依赖
<dependency>
   <groupId>org.redisson</groupId>
   <artifactId>redisson</artifactId>
   <version>3.21.3</version>
</dependency>
  • 配置yml
redisson:
	 addr:
		 singleAddr:
			 host: redis://127.0.0.1:6379
			 database: 0
  • 配置RedissonClient
@Configuration
public class RedissonConfig {

	 @Value("${redisson.addr.singleAddr.host}")
	 private String host;
	 
	 @Value("${redisson.addr.singleAddr.password}")
	 private String password;
	 
	 @Value("${redisson.addr.singleAddr.database}")
	 private int database;
	 
	 @Bean
	 public RedissonClient redissonClient() {
	 	Config config = new Config();
		config.useSingleServer().setAddress(host).setDatabase(database);
		return Redisson.create(config);
	 }
}

三、Redisson工作原理

在这里插入图片描述

四、Redisson使用扩展

4.1、Redisson单机连接

  • 配置yml
redisson:
	 addr:
		 singleAddr:
			 host: redis://127.0.0.1:6379
			 password: 12345678
			 database: 0
  • 配置RedissonClient
@Configuration
public class RedissonConfig {

	 @Value("${redisson.addr.singleAddr.host}")
	 private String host;
	 
	 @Value("${redisson.addr.singleAddr.password}")
	 private String password;
	 
	 @Value("${redisson.addr.singleAddr.database}")
	 private int database;
	 
	 @Bean
	 public RedissonClient redissonClient() {
	 	Config config = new Config();
		config.useSingleServer().setAddress(host).setPassword(password).setDatabase(database);
		return Redisson.create(config);
	 }
}

4.2、Redisson集群连接

  • 配置yml
redisson:
	 addr:
		 cluster:
			 hosts: redis://127.0.0.1:6379,...,redis://127.0.0.1:6388
			 password: 12345678
  • 配置RedissonClient
@Configuration
public class RedissonConfig {

	 @Value("${redisson.addr.cluster.hosts}")
	 private String hosts;
	 
	 @Value("${redisson.addr.cluster.password}")
	 private String password;
	 
	 /**
	 * 集群模式
	 * @return
	 */
	 @Bean
	 public RedissonClient redissonClient() {
	 	Config config = new Config();
	 	config.useClusterServers().addNodeAddress(hosts.split("[,]"))
			 .setPassword(password)
			 .setScanInterval(2000)
			 .setMasterConnectionPoolSize(10000)
			 .setSlaveConnectionPoolSize(10000);
	 	return Redisson.create(config);
	 }
}

4.3、Redisson主从连接

  • 配置yml
redisson:
	 addr:
		masterAndSlave:
			 masterhost: redis://127.0.0.1:6380
			 slavehosts: redis://127.0.0.1:6381,redis://127.0.0.1:6382
			 password: 12345678
			 database: 0
  • 配置RedissonClient
@Configuration
public class RedissonConfig {

	 @Value("${redisson.addr.masterAndSlave.masterhost}")
	 private String masterhost;
	 
	 @Value("${redisson.addr.masterAndSlave.slavehosts}")
	 private String slavehosts;
	 
	 @Value("${redisson.addr.masterAndSlave.password}")
	 private String password;
	 
	 @Value("${redisson.addr.masterAndSlave.database}")
	 private int database;
	 
	 /**
	 * 主从模式
	 * @return
	 */
	 @Bean
	 public RedissonClient redissonClient() {
		 Config config = new Config();
		 config.useMasterSlaveServers()
			 .setMasterAddress(masterhost)
			 .addSlaveAddress(slavehosts.split("[,]"))
			 .setPassword(password)
			 .setDatabase(database)
			 .setMasterConnectionPoolSize(10000)
			 .setSlaveConnectionPoolSize(10000);
		 return Redisson.create(config);
	 }
}

五、分布式锁总结

5.1、分布式锁特点

  1. 互斥性
    和我们本地锁⼀样互斥性是最基本,但是分布式锁需要保证在不同节点的不同线程的互斥。
  2. 可重入性
    同⼀个节点上的同⼀个线程如果获取了锁之后那么也可以再次获取这个锁。
  3. 锁超时
    和本地锁⼀样支持锁超时,加锁成功之后设置超时时间,以防止线程故障导致不释放锁,防止死锁。
  4. 高效,高可用
    加锁和解锁需要高效,同时也需要保证高可用防止分布式锁失效,可以增加降级。redission是基于redis的,redis的故障就会导致redission锁的故障,因此redission支持单节点redis、reids主从、reids集群
  5. 支持阻塞和非阻塞
    和 ReentrantLock ⼀样支持 lock 和 trylock 以及 tryLock(long timeOut)。

5.2、锁的分类

  1. 乐观锁与悲观锁
  • 乐观锁
  • 悲观锁
  1. 可重入锁和非可重入锁
  • 可重入锁:当在⼀个线程中第⼀次成功获取锁之后,在此线程中就可以再次获取
  • 非可重入锁
  1. 公平锁和非公平锁
  • 公平锁:按照线程的先后顺序获取锁
  • 非公平锁:多个线程随机获取锁
  1. 阻塞锁和非阻塞锁
  • 阻塞锁:不断尝试获取锁,直到获取到锁为止
  • 非阻塞锁:如果获取不到锁就放弃,但可以支持在⼀定时间段内的重试——在⼀段时间内如果没有获取到锁就放弃

5.3、Redission的使用

  1. 获取锁——公平锁和非公平锁
//获取公平锁
RLock lock = redissonClient.getFairLock("xxid");

//获取⾮公平锁
RLock lock = redissonClient.getLock("xxid");
  1. 加锁——阻塞锁和非阻塞锁
//阻塞锁(如果加锁成功之后,超时时间为30s;加锁成功开启看⻔狗,剩5s延⻓过期时间)
lock.lock();

//阻塞锁(如果加锁成功之后,设置⾃定义20s的超时时间)
lock.lock(20, TimeUnit.SECONDS);

//⾮阻塞锁(设置等待时间为3s;如果加锁成功默认超时间为30s)
boolean b = lock.tryLock(3, TimeUnit.SECONDS);

//⾮阻塞锁(设置等待时间为3s;如果加锁成功设置⾃定义超时间为20s)
boolean b = lock.tryLock(3, 20, TimeUnit.SECONDS);
  1. 释放锁
 lock.unlock();
  1. 应用示例
//公平⾮阻塞锁
RLock lock = redissonClient.getFairLock("xxid");
boolean b = lock.tryLock(3, 20, TimeUnit.SECONDS);

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

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

相关文章

chatgpt赋能python:Python以图搜图:如何用Python优化SEO?

Python以图搜图&#xff1a;如何用Python优化SEO&#xff1f; 随着搜索引擎算法的普及&#xff0c;优化您的SEO策略需要更多的创意和技巧。一种方法是使用Python以图搜图&#xff0c;具有该技能可以使您的网站上升到搜索结果列表的顶部。在这篇文章中&#xff0c;我们将探讨Py…

在外部编译器中使用pyqgis

pyqgis_dragonzoebai的博客-CSDN博客 升级后整理 例如在vscode当中添加qgis提供的python解释器&#xff0c;那么就可以使用qgis.core等库 批量处理gdb文件夹&#xff0c;导出对应文件夹目录的geojson文件。 我的gdb文件均没有坐标系&#xff0c;因此需要自己设置正确的坐标系…

chatgpt赋能python:Python网页的SEO优化指南

Python 网页的 SEO 优化指南 在如今互联网高度竞争的时代&#xff0c;一个网站的优化已经成为了至关重要的一环&#xff0c;特别是 SEO 优化。而对于使用 Python 开发网站的人来说&#xff0c;如何进行 SEO 优化&#xff0c;也是需要着重考虑的问题。本文将介绍一些 Python 网…

BGP选路规则实验

1、BGP选路规则实验-基础配置 1&#xff09;拓扑 2&#xff09;基础配置 第一步&#xff1a;基础配置&#xff1a; R1的配置&#xff1a; sysname R1 # interface GigabitEthernet0/0/0 ip address 192.168.12.1 255.255.255.0 # interface GigabitEthernet0/0/1 ip addres…

DeiT详解:知识蒸馏的Transformer

DeiT详解&#xff1a;知识蒸馏的Transformer 0. 引言1. ViT2. DeiT2.1 知识蒸馏2.1.1 提出背景2.1.2 理论原理 2.2 DeiT模型 3. 总结 0. 引言 针对 ViT 需求数据量大、运算速度慢的问题&#xff0c;Facebook 与索邦大学 Matthieu Cord 教授合作发表 Training data-efficient i…

工控机设备安全-系统加固分析

工控设备安全现状 工业控制系统是支撑国民经济的重要设施&#xff0c;是工业领域的神经中枢。现在工业控制系统已经广泛应用于电力、通信、化工、交通、航天等工业领域&#xff0c;支撑起国计民生的关键基础设施。 随着传统的工业转型&#xff0c;数字化、网络化和智能化的工…

倾斜摄影三维模型数据的高程偏差修正的几何纠正技术方法探讨

倾斜摄影三维模型数据的高程偏差修正的几何纠正技术方法探讨 倾斜摄影是一种先进的数字摄影技术&#xff0c;可以生成高分辨率、高精度的三维模型数据。然而&#xff0c;在倾斜摄影中&#xff0c;由于相机的倾斜角度和地形的高程差异&#xff0c;可能会出现高程偏差问题。为了…

Java性能权威指南-总结4

Java性能权威指南-总结4 Java性能调优工具箱操作系统的工具和分析CPU运行队列磁盘使用率网络使用率 Java监控工具基本的VM信息 Java性能调优工具箱 操作系统的工具和分析 CPU运行队列 快速小结 检查应用性能时&#xff0c;首先应该审查CPU时间。优化代码的目的是提升而不是…

树莓派初体验:开机啦

感谢大佬的赞助&#xff0c;这玩意是真的贵哇&#xff0c;呜呜呜呜呜呜&#xff0c;根本买不起 一、烧录系统 需要&#xff1a;SD卡&#xff08;推荐16G&#xff09;、读卡器&#xff08;推荐高速读卡器&#xff09; 进入官网&#xff1a;https://www.raspberrypi.com/softwa…

《MYSQL必知必会》读书笔记2

哈夫曼树的学习&#xff1a; http://t.csdn.cn/XJhUI 创建计算字段 字段&#xff1a;基本上与列的意思相同&#xff08;数据库列一般称为列&#xff0c;而字段通常用于计算字段连接上&#xff09; 拼接字段 拼接&#xff1a;将值联结到一起构成单个值 把两个结拼接起来&a…

【2023最叼教程】Appium自动化环境搭建保姆级教程

APP自动化测试运行环境比较复杂&#xff0c;稍微不注意安装就会失败。我见过不少朋友&#xff0c;装了1个星期&#xff0c;Appium 的运行环境还没有搭好的。 搭建环境本身不是一个有难度的工作&#xff0c;但是 Appium 安装过程中确实存在不少隐藏的比较深的坑&#xff0c;如果…

编程(38)----------计算机的部分原理

本篇主要总结一些计算机的理论部分. 计算机在发展历程中,无论是最早的巨无霸机器,还是现在小到可以拿在手中的掌机.只要其本质上是计算机,在最基础的结构上,都是以冯诺依曼体系所构建的. 冯诺依曼体系大致将计算机分为几个最重要的部分:输入,输出,中央处理器,存储设备.也就是…

Meta Quest 3发布:超越虚拟现实全新境界

2023年6月2日凌晨&#xff0c;全球领先的虚拟现实技术公司Meta隆重推出了Meta Quest 3无线头戴式显示器。这款全新设计的头戴设备从内到外焕然一新&#xff0c;为用户提供了全方位的体验。 借助全新一代骁龙芯片&#xff0c;Meta Quest 3拥有比Quest 2更高两倍的GPU处理能力&am…

VanillaNet详解:极简的网络模型

VanillaNet详解&#xff1a;极简的网络模型 0. 引言1. 网络结构2. 如何提高简单网络的非线性2.1 深度训练策略2.2 基于级数启发的激活函数3. 实验4. 代码解析总结 0. 引言 深度学习模型架构越复杂越好吗&#xff1f; 自过去的几十年里&#xff0c;人工神经网络取得了显著的进…

chatgpt赋能python:Python在硬件开发中的作用

Python在硬件开发中的作用 随着物联网的快速发展&#xff0c;越来越多的硬件设备需要与互联网连接。Python在硬件开发过程中扮演着重要的角色。 Python的优势 作为一种高级编程语言&#xff0c;Python有以下几个优势&#xff1a; 简单易学&#xff1a;Python的语法简洁清晰…

chatgpt赋能python:Python做网页可以直接访问吗?

Python做网页可以直接访问吗&#xff1f; Python作为一门功能强大的编程语言&#xff0c;近年来在Web开发中也越来越受欢迎。很多人或企业都采用Python来开发网站和网页&#xff0c;那么问题来了&#xff0c;Python做的网页能否直接被搜索引擎访问和索引呢&#xff1f; Pytho…

MySQL5-事务隔离级别和锁机制

❤️ 个人主页&#xff1a;程序员句号 &#x1f680; 支持水滴&#xff1a;点赞&#x1f44d; 收藏⭐ 留言&#x1f4ac;关注 &#x1f338; 订阅专栏&#xff1a;MySQL性能调优 原创博文、基础知识点讲解、有一定指导意义的中高级实践文章。 认真或有趣的技术分享。 该专栏陆…

【数据结构】数据结构与算法基础 课程笔记 第七章 查找

&#x1f680;Write In Front&#x1f680; &#x1f4dd;个人主页&#xff1a;令夏二十三 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd; &#x1f4e3;系列专栏&#xff1a;【数据结构】 &#x1f4ac;总结&#xff1a;希望你看完之后&#xff0c;…

Emacs之解决gtags -i --single-update占用率100%卡死问题(一百零六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

python --自动化测试UiAutomator2

安装adb 安装adb后使用命令 adb devices 出现下图即可; 安装python依赖(uiautomator2,weditor) pip install uiautomator22.16.23 weditor0.6.8 -i https://pypi.doubanio.com/simple# 在手机上安装 atx-agent 应用 # 安装apk服务到手机上 python -m uiautomator2 init脚本…