04-redis-分布式锁-edisson

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.pswp.cn/news/907699.shtml

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

相关文章

cf每日刷题

目录 String&#xff08;800&#xff09; Skibidus and Amogu&#xff08;800&#xff09; Apples in Boxes&#xff08;1100&#xff09; String&#xff08;800&#xff09; https://codeforces.com/problemset/problem/2062/A #include <iostream> #include <…

AWS WebRTC:获取ICE服务地址(part 1)

建立WebRTC连接的第二步是获取ICE服务地址。 ICE全称&#xff1a;Interactive Connectivity Establishment&#xff0c;建立互动连接。 ICE 服务地址&#xff0c;主要是 TURN 和 STUN 服务器的地址&#xff0c;用于 WebRTC 在 NAT 网络环境中协商建立连接。 上代码&#xff…

Python兴趣匹配算法:从理论到实战的进阶指南

目录 一、兴趣匹配算法的技术栈解析 1. 基础特征匹配阶段 2. 向量空间模型阶段 3. 深度学习阶段 二、工程化实践关键技术 1. 特征工程体系 2. 相似度计算优化 三、典型应用场景实现 1. 社交好友推荐系统 2. 电商商品推荐系统 四、性能优化与挑战应对 1. 计算性能优…

【C语言】讲解 程序分配的区域(新手)

目录 代码区 数据区 堆区 栈区 常量区 重点比较一下堆区与 栈区 总结&#xff1a; 前言&#xff1a; C语言程序的内存分配区域是理解其运行机制的重要部分。根据提供的多条证据&#xff0c;我们可以总结出C语言程序在运行时主要涉及以下五个关键内存区域&#xff1a; 代…

Go语言之接口与多态 -《Go语言实战指南》

接口是 Go 语言实现 多态 的核心机制。本章将帮助你理解接口的设计哲学、动态行为&#xff0c;以及它如何让 Go 实现面向接口编程的能力。 一、什么是接口&#xff1f; 接口是一组方法签名的集合&#xff0c;任何类型只要实现了接口中声明的所有方法&#xff0c;就被视为实现了…

JSR 303(即 Bean Validation)是一个通过​​注解在 Java Bean 上定义和执行验证规则​​的规范

&#x1f6e0;️ 一、JSR 303是什么&#xff1f; JSR 303&#xff08;Java Specification Requests 303&#xff09;是Java EE 6的子规范&#xff0c;全称​​Bean Validation​​。它通过注解方式对JavaBean的属性值进行标准化校验&#xff0c;例如检查非空、长度、格式等规则…

【图像处理入门】3. 几何变换基础:从平移旋转到插值魔法

摘要 掌握图像的几何变换相当于学会「图像的空间魔法」。本文将带你理解平移/旋转/缩放的数学原理&#xff0c;掌握OpenCV中warpAffine和getAffineTransform的核心用法&#xff0c;对比最近邻、双线性等插值算法的优劣。通过图像翻转、镜像、透视变换实战&#xff0c;学会用变…

微信小程序学习目录

个人简介 &#x1f468;‍&#x1f4bb;‍个人主页&#xff1a; 魔术师 &#x1f4d6;学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全栈发展 &#x1f6b4;个人状态&#xff1a; 研发工程师&#xff0c;现效力于政务服务网事业 &#x1f1e8;&#x1f1f3;人生格言&…

QT 5.15.2 程序中文乱码

1. 在.pro文件中添加&#xff1a; msvc { QMAKE_CXXFLAGS /source-charset:utf-8 /execution-charset:utf-8 }备注&#xff1a;.pro文件只有在选择 qmake 方式才会生成。 [Cmake 只会生成 CMakeLists.txt 文件] 2. 在文件首部增加以下程序行 #pragma execution_character_s…

Unity UI设计优化与模式原则

前言 在 Unity 中设计高效且可维护的 UI 系统时&#xff0c;需要结合性能优化和设计模式两大核心方向。以下是关键原则及实践方法&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&#xff0c;希望大家可以点击进来一起交流一下开发经验呀&#xff01; 一、UI 性能…

CppCon 2014 学习: The Implementation of Value Types

“The Implementation of Value Types” 在C里&#xff0c;通常指的是如何设计和实现**值类型&#xff08;value types&#xff09;**的类&#xff0c;确保它们符合值语义&#xff08;value semantics&#xff09;&#xff0c;也就是说&#xff1a; 对象的赋值和拷贝操作应该是…

每日算法刷题Day19 5.31:leetcode二分答案3道题,用时1h

6. 475.供暖器(中等&#xff0c;学习check函数双指针思想) 475. 供暖器 - 力扣&#xff08;LeetCode&#xff09; 思想 1.冬季已经来临。 你的任务是设计一个有固定加热半径的供暖器向所有房屋供暖。在加热器的加热半径范围内的每个房屋都可以获得供暖。现在&#xff0c;给出…

【计算机网络】第2章:应用层—应用层协议原理

目录 1. 网络应用的体系结构 2. 客户-服务器&#xff08;C/S&#xff09;体系结构 3. 对等体&#xff08;P2P&#xff09;体系结构 4. C/S 和 P2P 体系结构的混合体 Napster 即时通信 5. 进程通信 6. 分布式进程通信需要解决的问题 7. 问题1&#xff1a;对进程进行编址…

PHP+MySQL开发语言 在线下单订水送水小程序源码及搭建指南

随着互联网技术的不断发展&#xff0c;在线下单订水送水服务为人们所需要。分享一款 PHP 和 MySQL 搭建一个功能完善的在线订水送水小程序源码及搭建教程。这个系统将包含用户端和管理端两部分&#xff0c;用户可以在线下单、查询订单状态&#xff0c;管理员可以处理订单、管理…

vBulletin未认证API方法调用漏洞(CVE-2025-48827)

免责声明 本文档所述漏洞详情及复现方法仅限用于合法授权的安全研究和学术教育用途。任何个人或组织不得利用本文内容从事未经许可的渗透测试、网络攻击或其他违法行为。使用者应确保其行为符合相关法律法规,并取得目标系统的明确授权。 对于因不当使用本文信息而造成的任何直…

计算机模拟分子合成有哪些应用软件?

参阅&#xff1a;Top 创新大奖 以下是用于计算机模拟分子合成&#xff08;包括逆合成设计、分子对接、分子动力学模拟及综合设计平台&#xff09;的主流应用软件分类总结&#xff0c;结合其核心功能和应用场景进行整理&#xff1a; &#x1f52c; 一、逆合成设计与路线规划软件…

Excel 中的SUMIFS用法(基础版),重复项求和

1. 首先复制筛选条件所在的列&#xff0c;去除重复项目 数据 》重复项 》删除重复项 2. 输入函数公式 SUMIFS(C:C,A:A,E2) 3. 选中单元格&#xff0c;通过 ShiftF3 查看函数参数 第一个参数&#xff1a;求和区域&#xff0c;要累加的值所在的区域范围 第二个参数&#xff1a…

【xmb】内部文档148344597

基于小米CyberDog 2的自主导航与视觉感知系统设计报告 摘要&#xff1a; 本文针对2025年全国大学生计算机系统能力大赛智能系统创新设计赛&#xff08;小米杯&#xff09;初赛要求&#xff0c;设计并实现了基于小米仿生四足机器人CyberDog 2的平台系统方案。参赛作品利用Cyber…

从零开始理解机器学习:知识体系 + 核心术语详解

你可能听说过“机器学习”&#xff0c;觉得它很神秘&#xff0c;像是让电脑自己学会做事。其实&#xff0c;机器学习的本质很简单&#xff1a;通过数据来自动建立规则&#xff0c;从而完成预测或决策任务。 这篇文章将带你系统梳理机器学习的知识体系&#xff0c;并用贴近生活…

springboot集成websocket给前端推送消息

一般通常情况下&#xff0c;我们都是前端主动朝后端发送请求&#xff0c;那么有没有可能&#xff0c;后端主动给前端推送消息呢&#xff1f;这时候就可以借助websocket来实现。下面给出一个简单的实现样例。 首先创建一个websocketDemo工程&#xff0c;该工程的整体结构如下&a…