04-redis-分布式锁-edisson

article/2025/7/18 14:31:26

1 基本概念

百度百科:控制分布式系统之间同步访问共享资源方式
        在分布式系统中,常常需要协调他们的动作。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要互斥来防止彼此干扰来保证一致性,这个时候,便需要使用到分布式锁。
         在单机环境中可以使用Lock、Synchronized可以处理多线程并发问题可以确保同一时刻只有一个线程能够访问或修改共享资源。但是在分布式系统中,各个节点不在一个jvm环境中,进而需要新的技术方案来保证不同节点的一个互斥性。一般可以使用MySQL、Zookeeper、redis等方案,本文介绍redis中redisson的方式。

2 基本要求

1、互斥性:在任何时刻,只能有一个客户端持有锁、防止多个客户端同时访问共享资源
2、安全性:锁只能由持有它的客户端释放,其他客户端无法删除或释放该锁
3、可重入:持有锁的客户端可以重复进入
4、避免死锁:即使持有锁的客户端发生故障(比如宕机),锁也能通过超时或者释放机制被释放,
                        避免系统永久阻塞
5、容错性:在部分节点故障时,锁服务仍能正常运行,客户端可以正常获取和释放锁

扩展特性
‌高性能‌:获取和释放锁的操作应高效,避免成为系统瓶颈。‌‌
‌可重入性‌:允许同一客户端多次获取同一把锁,避免自我阻塞。‌‌
非阻塞性‌:如果获取锁失败,客户端应能立即返回结果,而非长时间等待

3 redisson分布式锁

3.1 代码实现

3.1.1 导入jar包

 <!-- Redis Starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- Redisson Starter (推荐) --><dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.23.4</version> <!-- 使用最新版本 --></dependency>

3.1.2 配置

application.yml配置

spring:redis:host: localhostport: 6381password: 123456  # 若无密码可删除database: 0

 配置类

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@Component
@ConfigurationProperties(prefix = "spring.redis")
public class RedisConfigData {private String host;private Integer port;private String password;private Integer database;public String getHost() {return host;}public void setHost(String host) {this.host = host;}public Integer getPort() {return port;}public void setPort(Integer port) {this.port = port;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public Integer getDatabase() {return database;}public void setDatabase(Integer database) {this.database = database;}
}
package com.hyq.config;import com.hyq.prefix.RedisConfigData;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class RedissonConfig {@Autowiredprivate RedisConfigData redisConfigData;@Beanpublic RedissonClient redissonClient() {Config config = new Config();// 单节点模式(根据spring.redis.*自动注入配置)config.useSingleServer()// 设置服务器的ip和端口号.setAddress("redis://" + redisConfigData.getHost() + ":" + redisConfigData.getPort())// 密码.setPassword(redisConfigData.getPassword()).setDatabase(redisConfigData.getDatabase());return Redisson.create(config);}}

 使用RedissonClient获取分布式锁,后面通过这个入口查看源码

 // 分布式锁名称:myLock
RLock lock = redissonClient.getLock("myLock");
// 尝试获取分布式锁 参数:等待时间  释放时间  时间单位
if(lock.tryLock(10, -1, TimeUnit.SECONDS)) {System.out.println("获取锁成功,");Thread.sleep(10000);// 释放锁lock.unlock();
} else {System.out.println("获取锁失败, 已经有人在支付cls");
}

 3.2 底层逻辑图

在redisson中分布式锁满足互斥、可重入、安全、容错等特性。
底层采用的是Hash存储结构:key:分布式锁名称  field: uuid+线程ID value:重入次数
存储线程ID主要是为了解决可重入,判断当前是否是获取锁的线程

源码分析见下节


http://www.hkcw.cn/article/CsFJjYojaR.shtml

相关文章

01 Netty简介

文章目录 概要1 Hello World1.1 什么是netty&#xff1f;1.2 Netty 的核心特性1.3 初识 netty 2 Netty 的核心组件2.1 EventLoop 和 EventLoopGroup2.1.1 基本概念2.1.2 与 Channel 关联2.1.3 EventLoopGroup 的实现2.1.4 常用方法 2.2 Channel2.2.1 Channel 的类型2.2.2 Chann…

熵最小化Entropy Minimization (一): 基本认识

文章目录 1. 前置知识Softmax函数信息熵&#xff08;Entropy&#xff09; 2. 熵最小化3. 案例理解4. 总结 熵最小化是一种利用未标记数据的策略&#xff0c;其核心思想是鼓励模型对未标记数据做出“自信”的预测&#xff0c;即预测概率分布尽可能尖锐&#xff08;Peaky&#xf…

jmeter:登录接口的token用于下一个接口

1、创建线程组 -》 添加 登录请求&#xff0c;在登录请求里面添加【正则表达式】 正则表达式提取器 引用名称&#xff1a;newtoken 正则表达式&#xff1a;token"."(*?) 模板&#xff1a; 1 1 1 匹配数字(0代表随机)&#xff1a;0 缺省值&#xff1a;null 2、创建…

Leetcode 2005. 斐波那契树的移除子树游戏

1.题目基本信息 1.1.题目描述 斐波那契树是一种按这种规则函数 order(n) 创建的二叉树&#xff1a; order(0) 是空树。 order(1) 是一棵只有一个节点的二叉树。 order(n) 是一棵根节点的左子树为 order(n - 2) 、右子树为 order(n - 1) 的二叉树。 Alice 和 Bob 在玩一种…

类 Excel 数据填报

类 Excel 填报模式&#xff0c;满足用户 Excel 使用习惯 数据填报&#xff0c;可作为独立的功能模块&#xff0c;用于管理业务流程、汇总采集数据&#xff0c;以及开发各类数据报送系统&#xff0c;因此&#xff0c;对于报表工具而言&#xff0c;其典型场景之一就是利用报表模…

TreeMap、TreeSet和HashMap、HashSet

目录 一、TreeMap&TreeSet 1.数据结构&#xff1a; 2.时间复杂度&#xff1a; 3.键/元素: 4.TreeMap基本操作: (与 HashMap 类似&#xff0c;但 put, get, remove 等操作会根据键的顺序进行)&#xff1a; 5.TreeMap遍历&#xff1a; 6.TreeSet基本操作 (与 HashSet 类…

电工基础【2】自锁、互锁、正反转电路

04 自锁、正反转电路 我们讲一下这个自锁和正反转。 自锁电路图示例图 加了一个这个 KM1 自锁。加了 KM1 的辅助触头&#xff0c;它怎么实现呢&#xff1f;它怎么就自锁了呢&#xff1f;没加它的时候为什么是点动&#xff1f;加它为什么自锁&#xff1f; 讲解一下。首先我们…

【计算机网络】传输层UDP协议

&#x1f525;个人主页&#x1f525;&#xff1a;孤寂大仙V &#x1f308;收录专栏&#x1f308;&#xff1a;计算机网络 &#x1f339;往期回顾&#x1f339;&#xff1a; 【计算机网络】应用层协议Http——构建Http服务服务器 &#x1f516;流水不争&#xff0c;争的是滔滔不…

day40python打卡

知识点回顾&#xff1a; 彩色和灰度图片测试和训练的规范写法&#xff1a;封装在函数中展平操作&#xff1a;除第一个维度batchsize外全部展平dropout操作&#xff1a;训练阶段随机丢弃神经元&#xff0c;测试阶段eval模式关闭dropout 作业&#xff1a;仔细学习下测试和训练代码…

2022-2023-2-移动机器人设计与实践-期末B

2022-2023-2-移动机器人设计与实践-期末A-CSDN博客 本文介绍了《移动机器人设计与实践》课程期末考试试卷B卷的内容与参考答案。试卷包含分析题、设计题、实践题和编程题四部分&#xff0c;总分100分。分析题考察学生对空中、水面和地上三种移动机器人模型运动机制及应用场景的…

DM8部分函数的功能分别举例说明

DM8部分函数的功能分别举例说明 1 环境说明2 函数功能使用示例2.1 AVG OVER2.2 COUNT OVER2.3 MIN OVER&#xff0c;MAX OVER&#xff0c;SUM OVER2.4 DENSE_RANK2.5 ROW_NUMBER2.6 FIRST2.7 LAG2.8 WM_CONCAT 3 更多达梦数据库全方位指南:安装 优化 与实战教程 1 环境说明 Cp…

大语言模型 24 - MCP 自动操作 提高模型上下文能力 Cursor + Sequential Thinking Server Memory

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; Java篇&#xff1a; MyBatis 更新完毕目前开始更新 Spring&#xff0c;一起深入浅出&#xff01; 大数据篇 300&#xff1a; Hadoop&…

【多线程初阶】线程状态 线程安全

文章目录 1.线程状态线程的状态及状态转移 2.多线程带来的风险 - 线程安全(重点)线程安全问题产生的原因如何解决线程安全问题 1.线程状态 EE的第一篇总览中有提到过 进程的状态 1.就绪 2.阻塞 这都是从操作系统的视角看待的 Java线程也是对操作系统线程的封装,针对状态这里…

Python 序列的修改、散列和切 片(Vector类第4版:散列和快速等值 测试)

Vector类第4版&#xff1a;散列和快速等值测试 我们要再次实现__hash__ 方法。加上现有的__eq__ 方法&#xff0c;这会把 Vector 实例变成可散列的对象。 示例 9-8 中的__hash__ 方法简单地计算 hash(self.x) ^ hash(self.y)。这一次&#xff0c;我们要使用^&#xff08;异或…

ai姿势项目

链接:https://pan.baidu.com/s/1dGSt7wEk8w6O7zlgme3CUQ?pwd=x60y 提取码:x60y --来自百度网盘超级会员V2的分享 配置环境 conda create -n 环境名称 python=3.8conda activate 环境名称 如果你运行程序的话会报错 ModuleNotFoundError: No module named mediapipe 进…

LoRA:高效微调预训练模型的利器

LoRA(Low-Rank Adaptation) 的思想&#xff1a;冻结预训练模型权重&#xff0c;将可训练的低秩分解矩阵注入到Transformer架构的每一层(也可单独配置某一层)中&#xff0c; 从而大大减少在下游任务的可训练参数量。 核心原理 对于预训练权重矩阵 &#xff0c;LoRA限制了其更新…

越界检测算法AI智能分析网关V4打造多场景化的应用解决方案

一、方案概述 随着社会发展&#xff0c;传统安防系统在复杂环境下暴露出误报率高、响应慢等短板。AI智能分析网关V4依托先进算法与强大算力&#xff0c;实现周界区域精准监测与智能分析&#xff0c;显著提升入侵防范效能。本方案通过部署该网关及其越界检测功能&#xff0c;为…

使用SkiaSharp打造专业级12导联心电图查看器:性能与美观兼具的可视化实践

前言 欢迎关注dotnet研习社&#xff0c;今天我们研究的Google Skia图形库的.NET绑定SkiaSharp图形库。 在医疗软件开发领域&#xff0c;心电图(ECG)数据的可视化是一个既有挑战性又极其重要的任务。作为开发者&#xff0c;我们需要创建既专业又直观的界面来展示复杂的生物医学…

24位高精度数据采集卡NET8860音频振动信号采集监测满足自动化测试应用现场的多样化需求

NET8860 高分辨率数据采集卡技术解析 阿尔泰科技的NET8860是一款高性能数据采集卡&#xff0c;具备8路同步模拟输入通道和24bit分辨率&#xff0c;适用于高精度信号采集场景。其输入量程覆盖10V、5V、2V、1V&#xff0c;采样速率高达256KS/s&#xff0c;能够满足多种工业与科研…

2025年05月30日Github流行趋势

项目名称&#xff1a;agenticSeek 项目地址url&#xff1a;https://github.com/Fosowl/agenticSeek项目语言&#xff1a;Python历史star数&#xff1a;13040今日star数&#xff1a;1864项目维护者&#xff1a;Fosowl, steveh8758, klimentij, ganeshnikhil, apps/copilot-pull-…