Redission红锁
目录
一、什么是红锁
二、Redission红锁的使用
一、什么是红锁
Redis 的作者 Salvatore Sanfilippo(又名 antirez)提出的一种基于多个 Redis 实例实现分布式锁的算法。红锁(Redlock)旨在解决单点故障问题,即当使用单个 Redis 实例作为锁服务时,如果该实例发生故障,则所有依赖于它的锁都将失效。红锁通过在多个独立的 Redis 实例上创建锁来增加系统的可用性。
红锁的工作原理大致如下:
-
客户端获取当前时间(以毫秒为单位)。
-
客户端尝试在每个 Redis 实例上获取锁,使用相同的 key 和 value(value 通常是唯一标识客户端的随机字符串),以及相同的超时时间(这个超时时间应该小于锁的有效期,以确保在网络分区的情况下,客户端不会无限期持有锁)。
-
客户端计算获取锁所花费的时间。如果客户端成功从大多数(N/2 + 1,其中 N 是 Redis 实例的数量)Redis 实例中获取到了锁,并且整个过程耗时小于锁的有效期减去超时时间,那么就认为客户端成功获取了红锁。
-
如果客户端未能成功获取大多数 Redis 实例上的锁,或者整个过程耗时超过了锁的有效期减去超时时间,那么客户端应当尝试释放所有已经成功获取的锁,以此保证其他客户端可以有机会获取到锁。
-
锁的有效期应该是客户端请求锁时设置的时间减去步骤3中的耗时。这确保了即使网络延迟导致客户端获取锁的时间较长,锁也不会过早地被其他客户端获取。
需要注意的是,虽然红锁算法旨在提高分布式锁的可靠性和可用性,但它的正确实现和使用需要谨慎考虑各种边界条件和潜在问题。例如,在某些极端情况下(如网络分区或时钟偏差),红锁可能无法完全避免竞态条件。因此,在实际应用中,开发者应该根据具体需求评估是否使用红锁以及如何正确配置和使用它。
二、Redission红锁的使用
Redisson 提供了对红锁(Redlock)的实现,使得开发者可以在分布式系统中轻松地使用这种高级锁机制。下面是一个使用 Redisson 实现红锁的详细例子。
-
添加依赖
首先,你需要在项目中添加 Redisson 的依赖。如果你使用的是 Maven 构建工具,那么可以在 pom.xml
文件中添加如下依赖:
<dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.20.0</version> <!-- 请根据实际情况选择最新版本 -->
</dependency>
-
配置 Redisson Client
接下来,需要配置 Redisson 客户端。为了实现红锁,通常会连接到多个独立的 Redis 实例。这里我们假设你已经有了多个 Redis 实例的地址。你可以通过 Redisson 的配置文件或者直接在代码中进行配置。以下是一个基于多个 Redis 实例的配置示例:
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;public class RedissionRedLockExample {private static final String[] REDIS_ADDRESSES = {"redis://127.0.0.1:7000","redis://127.0.0.1:7001","redis://127.0.0.1:7002"};public static void main(String[] args) {Config config = new Config();for (String address : REDIS_ADDRESSES) {config.useClusterServers().addNodeAddress(address);}RedissonClient redisson = Redisson.create(config);// 使用完 Redisson 后记得关闭它Runtime.getRuntime().addShutdownHook(new Thread(redisson::shutdown));// 下面是获取和使用红锁的例子tryGetRedLock(redisson);}private static void tryGetRedLock(RedissonClient redisson) {// 创建一个红锁对象RLock lock = redisson.getLock("myDistributedLock");try {// 尝试获取锁,最多等待1000毫秒,锁自动释放时间为10000毫秒boolean isLocked = lock.tryLock(1000, 10000, TimeUnit.MILLISECONDS);if (isLocked) {try {// 在这里执行需要加锁保护的代码逻辑System.out.println("成功获取锁,执行受保护的代码...");} finally {// 确保在任何情况下都能释放锁lock.unlock();System.out.println("锁已释放");}} else {System.out.println("未能获取锁");}} catch (InterruptedException e) {Thread.currentThread().interrupt();System.out.println("获取锁的过程中被中断");}}
}
-
运行程序
确保你的 Redis 集群已经启动并且可以从你的应用程序访问。然后运行上述代码。如果一切正常,你应该可以看到程序尝试获取锁,并在成功后执行受保护的代码段,最后释放锁。
-
注意事项
-
确保所有参与红锁的 Redis 实例都是独立的,以避免单点故障。
-
锁的持有时间应当设置合理,既不能太短以至于业务逻辑无法完成,也不能太长以免影响系统的并发性能。
-
在实际应用中,应该处理好各种异常情况,例如网络分区、时钟偏差等,确保系统的健壮性。
-
如果你在高并发环境下使用红锁,建议仔细测试并优化,以保证系统的稳定性和性能。
-
相关文章:
Redission红锁
目录 一、什么是红锁 二、Redission红锁的使用 一、什么是红锁 Redis 的作者 Salvatore Sanfilippo(又名 antirez)提出的一种基于多个 Redis 实例实现分布式锁的算法。红锁(Redlock)旨在解决单点故障问题,即当使用单…...

使用 CSS 的 `::selection` 伪元素来改变 HTML 文本选中时的背景颜色
定义 ::selection 伪元素: 在你的 CSS 文件中,添加 ::selection 伪元素,并设置 background-color 属性来改变选中文本的背景颜色。 示例代码: ::selection {background-color: yellow; /* 你可以根据需要更改颜色 */color: black…...
Spring Boot AOP日志打印实现
在 Spring Boot 3.1.12 中使用 AOP 实现日志打印,记录前端传入的参数和后端返回的数据,可以按照以下步骤进行: 添加依赖 首先,确保你的 pom.xml 文件中包含了 Spring AOP 的依赖: <dependency><groupId>…...

Windows远程--如何使用IP访问服务器
1.第一步:在本地按下winR打开运行窗口,输入mstsc 打开window自带的远程桌面组件,在打开的窗口内输入公网ip。 2.第二步:输入远程电脑的登录用户名和密码,即可成功建立连接。...
vscode中设置默认格式化工具pretter
1. 安装 Prettier 插件 打开 VSCode 的扩展市场(快捷键 CtrlShiftX 或点击左侧的扩展图标)。 搜索并安装 Prettier - Code formatter 插件。 2. 设置 VSCode 使用 Prettier 格式化代码 打开 VSCode 的设置(快捷键 Ctrl, 或点击右下角齿轮图标…...
Hadoop、Flink、Spark和Kafka
Hadoop、Flink、Spark和Kafka是大数据处理领域中的四个重要工具,它们在架构、数据处理方式以及性能等方面都存在区别。以下是具体分析: 架构 Hadoop:Hadoop的核心是HDFS(Hadoop Distributed File System)和MapReduce编…...
APP自动化测试元素定位及隐式等待
元素定位是UI自动化测试中最关键的一步,假如在自动化测试中没有定位到页面中素,也就无法完成对页面的测试操作。那么,我们在自动化测试中如何定位到是要部面元素呢? 下面聊一聊用 Appium 定位元素的方式。 定位页面元素有很多种…...
Element plus 的 upload 组件实现自定义上传
Element Plus 是一个基于 Vue 3 的 UI 组件库,提供了许多常用的 UI 组件。其中,Upload 组件用于文件上传功能。如果你想实现自定义上传逻辑,可以通过 before-upload 和 http-request 属性来实现。 以下是一个简单的示例,展示如何…...

力扣-数据结构-10【算法学习day.81】
前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?建议灵神的题单和代码随想录)和记录自己的学习过程,我的解析也不会做的非常详细,只会提供思路和一些关…...
WPF的一些控件的触发事件记录
<c1:C1ComboBox Width"230" ItemsSource"{Binding ReplaceWayList}" Style"{StaticResource ListSearch-C1ComboBox}" SelectedValueChanged"C1ComboBox_SelectedValueChanged", 下拉框事件,值改变事件&a…...
C# 设计模式(创建型模式):建造者模式
C# 设计模式(创建型模式):建造者模式 引言 在软件开发中,创建型设计模式主要关注对象的创建方式,其中建造者模式(Builder Pattern)是非常重要的一种。建造者模式通过一步一步构建一个复杂对象…...

关于模板函数的void返回值的判断:std::is_void与模板特化
int返回值的函数参数测试 #include <iostream> #include <functional>int return_int_func(){std::cout << __func__ << std::endl << std::flush;return 10086; }template<class U> auto CallDeviceMethodShort(std::function<U()&g…...

重现ORA-01555 细说Oracle Undo 数据管理
1. 概述 1.1. Undo 数据应用 undo数据是: 原始的、修改之前的数据副本 是针对更改数据的每个事务处理所捕获的 至少保留到事务处理结束 用于支持: 回退操作 读取一致性查询 闪回查询、闪回事务处理和闪回表 从失败的事务处理中进行恢复 1.2. 事…...
通过blob请求后端导出文件
后端controller PostMapping("/exportPlanProject2")public void exportActive(RequestBody IfPlanListDTO plan, HttpServletResponse httpServletResponse) throws IOException {}后端service public void exportExcel2(HttpServletResponse response) throws IOEx…...

养老院小程序怎么搭建?让老年人老有所养,老有所依!
随着社会老龄化的加剧,养老服务成为一个越来越重要的话题。在这个互联网的时代,养老院也开始拥抱技术,借助小程序的便捷性来改善老年人的居住和生活体验。那么,如何搭建一个适合老年人的养老院小程序呢?本文将从实际操作的角度出…...

【2024美国数学建模AB题原文翻译】
2024 MCM 问题A:资源可用性与性别比例 虽然一些动物物种超出了通常的雄性或雌性性别范畴,但大多数物种要么是雄性要么是雌性。尽管许多物种在出生时展现出1:1的性别比例,其他物种则偏离了这个性别比例,这被称为适应性性别比例变化…...
判断旗帜是否符合ISO新标准
背景介绍 在全球化的背景下,不同国家的旗帜设计需要满足某些国际标准以便于统一化和规范化。ISO(国际标准化组织)提出了一项新规定,要求国家旗帜在设计时遵循一些规则,特别是棋盘状设计中的颜色分布规则。比如&#x…...
海量数据存储实现方案设计1-mycat版
目的 这里使用mycat为例子说明方案设计思路(仅个人学习、思考笔记)。主要尝试解决海量数据存储、动态不停机扩容问题,不再受限于单库、单表、单机等。 mycat简述 mycat 主要以中间件代理的方式,不侵入工程代码来实现分库分表&a…...

Elasticsearch检索之三:官方推荐方案search_after检索实现(golang)
Elasticsearch8.17.0在mac上的安装 Kibana8.17.0在mac上的安装 Elasticsearch检索方案之一:使用fromsize实现分页 快速掌握Elasticsearch检索之二:滚动查询(scrool)获取全量数据(golang) 1、search_after检索 在前面的文章介绍了fromsize的普通分页…...

hot100_238. 除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...

Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...

vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...

人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
云原生周刊:k0s 成为 CNCF 沙箱项目
开源项目推荐 HAMi HAMi(原名 k8s‑vGPU‑scheduler)是一款 CNCF Sandbox 级别的开源 K8s 中间件,通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度,为容器提供统一接口,实现细粒度资源配额…...