当前位置: 首页 > news >正文

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 实例都是独立的,以避免单点故障。

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

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

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

 

相关文章:

Redission红锁

目录 一、什么是红锁 二、Redission红锁的使用 一、什么是红锁 Redis 的作者 Salvatore Sanfilippo&#xff08;又名 antirez&#xff09;提出的一种基于多个 Redis 实例实现分布式锁的算法。红锁&#xff08;Redlock&#xff09;旨在解决单点故障问题&#xff0c;即当使用单…...

使用 CSS 的 `::selection` 伪元素来改变 HTML 文本选中时的背景颜色

定义 ::selection 伪元素&#xff1a; 在你的 CSS 文件中&#xff0c;添加 ::selection 伪元素&#xff0c;并设置 background-color 属性来改变选中文本的背景颜色。 示例代码&#xff1a; ::selection {background-color: yellow; /* 你可以根据需要更改颜色 */color: black…...

Spring Boot AOP日志打印实现

在 Spring Boot 3.1.12 中使用 AOP 实现日志打印&#xff0c;记录前端传入的参数和后端返回的数据&#xff0c;可以按照以下步骤进行&#xff1a; 添加依赖 首先&#xff0c;确保你的 pom.xml 文件中包含了 Spring AOP 的依赖&#xff1a; <dependency><groupId>…...

Windows远程--如何使用IP访问服务器

1.第一步&#xff1a;在本地按下winR打开运行窗口&#xff0c;输入mstsc 打开window自带的远程桌面组件&#xff0c;在打开的窗口内输入公网ip。 2.第二步&#xff1a;输入远程电脑的登录用户名和密码&#xff0c;即可成功建立连接。...

vscode中设置默认格式化工具pretter

1. 安装 Prettier 插件 打开 VSCode 的扩展市场&#xff08;快捷键 CtrlShiftX 或点击左侧的扩展图标&#xff09;。 搜索并安装 Prettier - Code formatter 插件。 2. 设置 VSCode 使用 Prettier 格式化代码 打开 VSCode 的设置&#xff08;快捷键 Ctrl, 或点击右下角齿轮图标…...

Hadoop、Flink、Spark和Kafka

Hadoop、Flink、Spark和Kafka是大数据处理领域中的四个重要工具&#xff0c;它们在架构、数据处理方式以及性能等方面都存在区别。以下是具体分析&#xff1a; 架构 Hadoop&#xff1a;Hadoop的核心是HDFS&#xff08;Hadoop Distributed File System&#xff09;和MapReduce编…...

APP自动化测试元素定位及隐式等待

元素定位是UI自动化测试中最关键的一步&#xff0c;假如在自动化测试中没有定位到页面中素&#xff0c;也就无法完成对页面的测试操作。那么&#xff0c;我们在自动化测试中如何定位到是要部面元素呢&#xff1f; 下面聊一聊用 Appium 定位元素的方式。 定位页面元素有很多种…...

Element plus 的 upload 组件实现自定义上传

Element Plus 是一个基于 Vue 3 的 UI 组件库&#xff0c;提供了许多常用的 UI 组件。其中&#xff0c;Upload 组件用于文件上传功能。如果你想实现自定义上传逻辑&#xff0c;可以通过 before-upload 和 http-request 属性来实现。 以下是一个简单的示例&#xff0c;展示如何…...

力扣-数据结构-10【算法学习day.81】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;建议灵神的题单和代码随想录&#xff09;和记录自己的学习过程&#xff0c;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关…...

WPF的一些控件的触发事件记录

<c1:C1ComboBox Width"230" ItemsSource"{Binding ReplaceWayList}" Style"{StaticResource ListSearch-C1ComboBox}" SelectedValueChanged"C1ComboBox_SelectedValueChanged"&#xff0c; 下拉框事件&#xff0c;值改变事件&a…...

C# 设计模式(创建型模式):建造者模式

C# 设计模式&#xff08;创建型模式&#xff09;&#xff1a;建造者模式 引言 在软件开发中&#xff0c;创建型设计模式主要关注对象的创建方式&#xff0c;其中建造者模式&#xff08;Builder Pattern&#xff09;是非常重要的一种。建造者模式通过一步一步构建一个复杂对象…...

关于模板函数的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数据是&#xff1a; 原始的、修改之前的数据副本 是针对更改数据的每个事务处理所捕获的 至少保留到事务处理结束 用于支持&#xff1a; 回退操作 读取一致性查询 闪回查询、闪回事务处理和闪回表 从失败的事务处理中进行恢复 1.2. 事…...

通过blob请求后端导出文件

后端controller PostMapping("/exportPlanProject2")public void exportActive(RequestBody IfPlanListDTO plan, HttpServletResponse httpServletResponse) throws IOException {}后端service public void exportExcel2(HttpServletResponse response) throws IOEx…...

养老院小程序怎么搭建?让老年人老有所养,老有所依!

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

【2024美国数学建模AB题原文翻译】

2024 MCM 问题A&#xff1a;资源可用性与性别比例 虽然一些动物物种超出了通常的雄性或雌性性别范畴&#xff0c;但大多数物种要么是雄性要么是雌性。尽管许多物种在出生时展现出1:1的性别比例&#xff0c;其他物种则偏离了这个性别比例&#xff0c;这被称为适应性性别比例变化…...

判断旗帜是否符合ISO新标准

背景介绍 在全球化的背景下&#xff0c;不同国家的旗帜设计需要满足某些国际标准以便于统一化和规范化。ISO&#xff08;国际标准化组织&#xff09;提出了一项新规定&#xff0c;要求国家旗帜在设计时遵循一些规则&#xff0c;特别是棋盘状设计中的颜色分布规则。比如&#x…...

海量数据存储实现方案设计1-mycat版

目的 这里使用mycat为例子说明方案设计思路&#xff08;仅个人学习、思考笔记&#xff09;。主要尝试解决海量数据存储、动态不停机扩容问题&#xff0c;不再受限于单库、单表、单机等。 mycat简述 mycat 主要以中间件代理的方式&#xff0c;不侵入工程代码来实现分库分表&a…...

Elasticsearch检索之三:官方推荐方案search_after检索实现(golang)

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

hot100_238. 除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...