04-redis-分布式锁-redisson

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/diannao/85736.shtml

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

相关文章

性能优化 - 案例篇:缓存_Guava#LoadingCache设计

文章目录 Pre引言1. 缓存基本概念2. Guava 的 LoadingCache2.1 引入依赖与初始化2.2 手动 put 与自动加载&#xff08;CacheLoader&#xff09;2.2.1 示例代码 2.3 缓存移除与监听&#xff08;invalidate removalListener&#xff09; 3. 缓存回收策略3.1 基于容量的回收&…

使用jstack排查CPU飙升的问题记录

最近&#xff0c;看到短视频传播了一个使用jstack来协助排查CPU飙升的案例。我也是比较感兴趣&#xff0c;参考了视频博主的流程&#xff0c;自己做了下对应案例的实战演练&#xff0c;在此&#xff0c;想做一下&#xff0c;针对相关问题模拟与排查演练的实战过程记录。 案例中…

Sql Server 中常用语句

1.创建用户数据库 --创建数据库 use master --切换到master数据库 go-- 终止所有与SaleManagerDB数据库的连接 alter database SaleManagerDB set single_user with rollback immediate goif exists (select * from sysdatabases where nameSaleManagerDB) drop database Sal…

联通专线赋能,亿林网络裸金属服务器:中小企业 IT 架构升级优选方案

在当今数字化飞速发展的时代&#xff0c;中小企业面临着日益增长的业务需求与复杂多变的市场竞争环境。如何构建高效、稳定且具性价比的 IT 架构&#xff0c;成为众多企业突破发展瓶颈的关键所在。而亿林网络推出的 24 核 32G 裸金属服务器&#xff0c;搭配联通专线的千兆共享带…

LangChain核心之Runnable接口底层实现

导读&#xff1a;作为LangChain框架的核心抽象层&#xff0c;Runnable接口正在重新定义AI应用开发的标准模式。这一统一接口设计将模型调用、数据处理和API集成等功能封装为可复用的逻辑单元&#xff0c;通过简洁的管道符语法实现复杂任务的声明式编排。 对于面临AI应用架构选择…

CSP严格模式返回不存在的爬虫相关文件

文章目录 说明示例&#xff08;返回404&#xff09;示例&#xff08;创建CSP例外&#xff09; 说明 日期&#xff1a;2025年6月4日。 CSP严格模式是default-src none&#xff0c;但有些web应用中&#xff0c;在爬虫相关文件不存在的情况下&#xff0c;依旧返回了对应文件&…

DeviceNET从站转EtherNET/IP主站在盐化工行业的创新应用

在工业自动化飞速发展的今天&#xff0c;盐化工行业也在积极探索智能化升级的路径。其中&#xff0c;设备之间的高效通信与协同工作成为了提升生产效率和质量的关键。而JH-DVN-EIP疆鸿智能DeviceNET从站转EtherNET/IP主站的技术应用&#xff0c;为盐化工行业带来了全新的解决方…

安装 Nginx

个人博客地址&#xff1a;安装 Nginx | 一张假钞的真实世界 对于 Linux 平台&#xff0c;Nginx 安装包 可以从 nginx.org 下载。 Ubuntu: 版本Codename支持平台12.04precisex86_64, i38614.04trustyx86_64, i386, aarch64/arm6415.10wilyx86_64, i386 在 Debian/Ubuntu 系统…

默认网关 -- 负责转发数据包到其他网络的设备(通常是路由器)

✅ 默认网关概括说明&#xff1a; 默认网关&#xff08;Default Gateway&#xff09;是网络中一台负责转发数据包到其他网络的设备&#xff08;通常是路由器&#xff09;。当一台主机要访问不在本地子网内的设备时&#xff0c;会将数据包发给默认网关&#xff0c;由它继续转发…

cv::FileStorage用法

cv::FileStorage 是 OpenCV 中的一个类&#xff0c;用于读取和写入结构化数据&#xff08;如 YAML、XML、JSON&#xff09;。它非常适合保存和加载诸如&#xff1a; 相机内参&#xff08;K、D&#xff09; 位姿&#xff08;R、T&#xff09; IMU 数据 配置参数 向量、矩阵、…

WebFuture:启动服务提示Job webfuture.service/start failed with result ‘dependency‘处理办法

问题分析&#xff1a; 当出现 Job webfuture.service/start failed with result dependency. 这样的错误提示时&#xff0c;通常意味着 webfuture.service 这个服务在启动时因为依赖关系的问题而未能成功启动 解决办法&#xff1a; 原因分析&#xff1a; webfuture.service 可…

Java 大视界 -- Java 大数据机器学习模型在遥感图像变化检测中的应用与改进(235)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也期待你毫无保留地分享独特见解,愿我们于此携手成长,共赴新程!💖 全网…

HarmonyOS运动开发:精准估算室内运动的距离、速度与步幅

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在室内运动场景中&#xff0c;由于缺乏 GPS 信号&#xff0c;传统的基于卫星定位的运动数据追踪方法无法使用。因此&#xff0c;如何准确估算室内运动的距离、速度和步幅&#xff0c;…

商品模块中的多规格设计:实现方式与电商/ERP系统的架构对比

在商品管理系统中&#xff0c;多规格设计&#xff08;Multi-Specification Product Design&#xff09;是一个至关重要但又极具挑战性的领域。无论是面向消费者的电商系统&#xff0c;还是面向企业管理的ERP系统&#xff0c;对商品规格的处理方式直接影响库存管理、订单履约、数…

HTML 等价字符引用:系统化记忆指南

HTML 等价字符引用:系统化记忆指南 在 HTML 中,字符引用(Character Entity References)用于表示保留字符或特殊符号。我将提供一个系统化的方法来记忆这些重要实体,并解释它们的实际应用。 什么是等价字符引用? HTML 字符引用有两种形式: 命名实体:&entity_name…

Java 线程池原理详解

Java 线程池原理详解 一、引言 在高并发场景下&#xff0c;频繁地创建与销毁线程将带来极大的性能开销。为了提升资源复用性与程序响应速度&#xff0c;Java 提供了线程池机制&#xff08;java.util.concurrent 包&#xff09;。线程池通过复用线程、控制线程数量、任务排队管…

Mybatis入门到精通

一&#xff1a;什么是Mybatis 二&#xff1a;Mybatis就是简化jdbc代码的 三&#xff1a;Mybatis的操作步骤 1&#xff1a;在数据库中创建一个表&#xff0c;并添加数据 我们这里就省略了 2&#xff1a;Mybatis通过maven来导入坐标&#xff08;jar包&#xff09; 3&#xff1a…

化学方程式配平免费API接口教程

接口简介&#xff1a; 根据反应物和生成物配平化学方程式。 请求地址&#xff1a; https://cn.apihz.cn/api/other/hxfcs.php 请求方式&#xff1a; POST或GET。 请求参数&#xff1a; 【名称】【参数】【必填】【说明】 【用户ID】【id】【是】【用户中心的数字ID&#xff…

Spring学习笔记:Spring的基于注解的XML的详细配置

按照刘Java的顺序&#xff0c;应该是从基于XML的DI开始接着上面的关于IoC容器装配。主要介绍学习Spring的XML基于注解的详细配置。 第一步是搭建一个Spring的基础工程&#xff08;maven管理&#xff09;&#xff0c;通过IoC机制获取IoC容器的对象。 创建maven工程并在pom文件…

(四)动手实现多层感知机:深度学习中的非线性建模实战

1 多层感知机&#xff08;MLP&#xff09; 多层感知机&#xff08;Multilayer Perceptron, MLP&#xff09;是一种前馈神经网络&#xff0c;包含一个或多个隐藏层。它能够学习数据中的非线性关系&#xff0c;广泛应用于分类和回归任务。MLP的每个神经元对输入信号进行加权求和…