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
繁體地址,請注明出處:http://hk.pswp.cn/diannao/85736.shtml
英文地址,請注明出處:http://en.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的每個神經元對輸入信號進行加權求和…