Redission红锁

目录

一、什么是红锁

二、Redission红锁的使用


 

一、什么是红锁

Redis 的作者 Salvatore Sanfilippo(又名 antirez)提出的一种基于多个 Redis 实例实现分布式锁的算法。红锁(Redlock)旨在解决单点故障问题,即当使用单个 Redis 实例作为锁服务时,如果该实例发生故障,则所有依赖于它的锁都将失效。红锁通过在多个独立的 Redis 实例上创建锁来增加系统的可用性。

红锁的工作原理大致如下:

  1. 客户端获取当前时间(以毫秒为单位)。

  2. 客户端尝试在每个 Redis 实例上获取锁,使用相同的 key 和 value(value 通常是唯一标识客户端的随机字符串),以及相同的超时时间(这个超时时间应该小于锁的有效期,以确保在网络分区的情况下,客户端不会无限期持有锁)。

  3. 客户端计算获取锁所花费的时间。如果客户端成功从大多数(N/2 + 1,其中 N 是 Redis 实例的数量)Redis 实例中获取到了锁,并且整个过程耗时小于锁的有效期减去超时时间,那么就认为客户端成功获取了红锁。

  4. 如果客户端未能成功获取大多数 Redis 实例上的锁,或者整个过程耗时超过了锁的有效期减去超时时间,那么客户端应当尝试释放所有已经成功获取的锁,以此保证其他客户端可以有机会获取到锁。

  5. 锁的有效期应该是客户端请求锁时设置的时间减去步骤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 实例都是独立的,以避免单点故障。

    • 锁的持有时间应当设置合理,既不能太短以至于业务逻辑无法完成,也不能太长以免影响系统的并发性能。

    • 在实际应用中,应该处理好各种异常情况,例如网络分区、时钟偏差等,确保系统的健壮性。

    • 如果你在高并发环境下使用红锁,建议仔细测试并优化,以保证系统的稳定性和性能。

 

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

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

相关文章

VTK 鼠标+键盘重构

1、鼠标事件 如果有鼠标事件处理等相应的需求,可以重写该事件。 void OnMouseMove() override; //鼠标移动事件 void OnLeftButtonDown() override;//左键按下事件 void OnLeftButtonUp() override;//左键抬起事件 void OnMiddleButtonDown() override;//滚轮按下事件 …

ELK 使用教程采集系统日志 Elasticsearch、Logstash、Kibana

前言 你知道对于一个系统的上线考察&#xff0c;必备的几样东西是什么吗&#xff1f;其实这也是面试中考察求职者&#xff0c;是否真的做过系统开发和上线的必备问题。包括&#xff1a;服务治理(熔断/限流) (opens new window)、监控 (opens new window)和日志&#xff0c;如果…

node内置模块之---path 模块

path 模块的作用 path 模块是 Node.js 的核心模块之一&#xff0c;提供了用于处理和转换文件路径的功能。它能帮助你在不同操作系统间处理文件路径时避免平台差异&#xff08;如 Windows 和 Unix 系统使用不同的路径分隔符&#xff09; path 模块api介绍 使用场景&#xff1a; …

STM32G0B1 can Error_Handler 解决方法

问题现象 MCU上电&#xff0c;发送0x13帧数据固定进入 Error_Handler 硬件介绍 MCU :STM32G0B1 can:NSI1042 tx 接TX RX 接RX 折腾了一下午&#xff0c;无解&#xff0c;问题依旧&#xff1b; 对比测试 STM32G431 手头有块G431 官方评估版CAN 模块&#xff1b; 同样的…

在ros2 jazzy和gazebo harmonic下的建图导航(cartographer和navigation)实现(基本)

我的github分支&#xff01;&#xff01;&#xff01; 你可以在这里找到相对应的源码。 DWDROME的MOGI分支 来源于&#xff01;&#xff01; MOGI-ROS/Week-3-4-Gazebo-basics 学习分支整理日志 分支概述 这是一个用于个人学习的新分支&#xff0c;目的是扩展基本模型并添加…

Redis 实现分布式锁

文章目录 引言一、Redis的两种原子操作1.1 Redis 的原子性1.2 单命令1.3 Lua 脚本1.4 对比单命令与 Lua 脚本 二、Redis 实现分布式锁2.1 分布式锁的概念与需求2.1.1 什么是分布式锁&#xff1f;2.1.2 分布式锁的常见应用场景 2.2 基于 Redis 的分布式锁实现2.2.1 锁的获取与释…

区块链与微服务研究报告

摘要 区块链与微服务架构的结合为现代企业级应用提供了新的解决方案。区块链技术以其不可篡改性和透明性&#xff0c;解决了微服务在分布式环境下的数据一致性和安全性问题。本文将探讨区块链与微服务的基本概念、技术原理、应用案例以及未来研究方向。 1. 引言 随着信息技术…

SAP MM物料管理模块常见BAPI函数清单

【SAP系统研究】 #SAP #MM #物料管理 #函数 #BAPI 1、物料主数据 BAPI_MATERIAL_SAVEDATA 创建/更改物料主数据 BAPI_MATERIAL_SAVEREPLICA 物料主数据视图扩充 BAPI_MATERIAL_EXISTENCECHECK 检查物料主数据是否存在 BAPI_MATERIAL_GETLIST 显示物料主数据明细 BAPI_MATERIALG…

Stable Diffusion和Midjourney有什么区别?

Stable Diffusion 和 Midjourney 主要有以下区别&#xff1a; 目录 费用与可访问性 设备要求 安装与使用 学习成本 图像生成效果 可控性与定制性 私密性 费用与可访问性 Stable Diffusion&#xff1a;开源免费&#xff0c;任何人都可以免费下载并自行部署使用&#xf…

104周六复盘 (188)UI

1、早上继续看二手书的一个章节&#xff0c;程序开发流程、引擎、AI等内容&#xff0c; 内容很浅&#xff0c;基本上没啥用&#xff0c;算是复习。 最大感触就是N年前看同类书的里程碑、AI相关章节时&#xff0c;会感觉跟自己没啥关系&#xff0c; 而如今则密切相关&#xf…

Mono里运行C#脚本23—mono_jit_exec

前面已经分析一部分代码,可以打下基础知识,当然还有很多其它部分的内容,没有深入去了解。 接着下来,我们去探索一下怎么样找到执行应用程序的入口。 在这个嵌入脚本程序里,有一个这样的函数调用: main_function (domain, file, argc - 1, argv + 1); 这个函数的作用,…

浅谈分布式共识算法

分布式共识算法 基础概念1、容错2、共识3、拜占庭将军问题4、多数派5、共识算法分类6、ACID&BASE&CAP Paxos1、相关概念2、三种角色3、运行阶段4、Multi Paxos5、总结6、演化 ZAB1、相关概念2、三种角色3、成员状态4、运行阶段5、ZooKeeper流程6、总结 Raft1、相关概念…

你喜欢看哪类的网上视频教程?

作为前端开发&#xff0c;我通常喜欢看以下几类网上视频教程&#xff1a; 技术框架和库教程&#xff1a;例如React、Vue、Angular等前端框架的教程。这些教程能帮助我深入了解这些框架的工作原理&#xff0c;以及如何高效地使用它们来开发Web应用。 CSS和JavaScript高级技巧&a…

(leetcode算法题)382. 链表随机节点

如果给你一个 智能记录 k行内容的小笔记本&#xff0c;从一本你也不知道有多少行的 C Primer 中进行摘抄&#xff0c;你应该怎么做才能让抄写的时候能让书中的每一行都等概率的出现在小笔记本中&#xff1f; 答&#xff1a;准备好一个公平的轮盘和一个巨大的摇奖机&#xff0c…

腾讯云智能结构化 OCR:驱动多行业数字化转型的核心引擎

在当今数字化时代的汹涌浪潮中&#xff0c;数据已跃升为企业发展的关键要素&#xff0c;其高效、精准的处理成为企业在激烈市场竞争中脱颖而出的核心竞争力。腾讯云智能结构化 OCR 技术凭借其前沿的科技架构与卓越的功能特性&#xff0c;宛如一颗璀璨的明星&#xff0c;在交通、…

Flume拦截器的实现

Flume conf文件编写 vim file_to_kafka.conf#定义组件 a1.sources r1 a1.channels c1#配置source a1.sources.r1.type TAILDIR a1.sources.r1.filegroups f1 a1.sources.r1.filegroups.f1 /Users/zhangjin/model/project/realtime-flink/applog/log/app.* # 设置断点续传…

2025-01-04 Unity插件 YodaSheet2 —— 基础用法

文章目录 环境配置1 创建 YadeSheetData2 读取方式2.1 表格读取2.2 列表读取 3 自定义设置3.1 修改代码生成位置3.2 添加列表支持3.2.1 修改 DataTypeMapper.cs3.2.2 修改 SheetDataExtensions.cs3.2.3 修改 CodeGeneratorEditor.cs3.2.4 测试 ​ 官方文档&#xff1a; Unity …

matlab时频分析库

time frequency gallery

『 Linux 』高级IO (三) - Epoll模型的封装与EpollEchoServer服务器

文章目录 前情提要Epoll 的封装Epoll封装完整代码(供参考) Epoll Echo ServerEpoll Echo Server 测试及完整代码 前情提要 在上一篇博客『 Linux 』高级IO (二) - 多路转接介绍并完成了两种多路转接方案的介绍以及对应多路转接方案代码的编写,分别为SelectServer服务器与PollSe…

PDF预览插件

PDF预览插件 可用于当前页面弹窗形式查看,可增加一些自定义功能 pdf预览插件 代码块: pdfobject.js <div class="pdfwrap"><div class="item"><h3>笑场</h3><div class="tags"><p>李诞</p><i&…