谷粒商城:Redisson

目錄

Redisson

整合Redisson

?RLock

RReadWriteLock

RSemaphore

RCountDownLatch

優化三級分類緩存

緩存一致性問題

雙寫模式

失效模式

臟數據解決


Redisson

提供redis分布式鎖(Distributed locks with Redis)的java客戶端

整合Redisson

引入

        <dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.12.0</version></dependency>

程序化配置

@Configuration
public class RedissonConfig {@Value("${spring.redis.host}"+":"+"${spring.redis.port}")private String singleAddress;@Bean(destroyMethod = "shutdown")public RedissonClient redisson() throws IOException {Config config = new Config();/*SingleServer() 單節點模式redis:// redis 連接協議*/config.useSingleServer().setAddress("redis://"+singleAddress);return Redisson.create(config);}
}

?RLock

可重入鎖(Reentrant Lock)它允許同一個線程多次獲取同一把鎖而不會產生死鎖。

RLock lock = redisson.getLock("myLock");// 嘗試獲取鎖,最多等待10秒,鎖有效期30秒
boolean res = lock.tryLock(10, 30, TimeUnit.SECONDS);
if (res) {try {// 業務代碼} finally {lock.unlock();}
}
  1. 可重入性:同一線程可多次獲取同一把鎖

  2. 鎖續期:內置看門狗機制自動續期

  3. 公平鎖:支持公平鎖和非公平鎖

  4. 鎖釋放:確保只有鎖持有者能釋放鎖


RReadWriteLock

讀寫鎖,它允許多個讀操作同時進行,但寫操作是排他的。

RReadWriteLock rwLock = redisson.getReadWriteLock("myReadWriteLock");
RLock readLock = rwLock.readLock();  // 獲取讀鎖
RLock writeLock = rwLock.writeLock(); // 獲取寫鎖
writeLock.lock();  // 先獲取寫鎖
try {// 寫操作...// 保持寫鎖的同時獲取讀鎖(鎖降級)readLock.lock();try {// 讀操作...} finally {// 注意:這里不能釋放寫鎖}// 可以繼續持有寫鎖做其他操作
} finally {writeLock.unlock();  // 最后釋放寫鎖// 此時仍持有讀鎖
}
  1. 讀寫分離

    • 多個線程可以同時持有讀鎖

    • 寫鎖是排他的,有寫鎖時不能有讀鎖或其他寫鎖

  2. 可重入性

    • 讀鎖和寫鎖都支持可重入

    • 同一線程可以多次獲取同一把讀鎖或寫鎖

  3. 鎖降級

    • 支持將寫鎖降級為讀鎖

    • 但不支持讀鎖升級為寫鎖(會死鎖)

  4. 公平性選擇

    • 支持公平和非公平兩種模式


RSemaphore

?信號量,它允許多個線程/進程在分布式環境中協調對共享資源的訪問

// 獲取信號量實例(初始許可數為5)
RSemaphore semaphore = redisson.getSemaphore("mySemaphore");
semaphore.trySetPermits(5);  // 初始化許可數量// 獲取1個許可(阻塞直到可用)
semaphore.acquire();try {// 訪問受限資源accessLimitedResource();
} finally {// 釋放許可semaphore.release();
}
  1. 資源限制:控制同時訪問特定資源的線程/進程數量

  2. 分布式支持:跨JVM、跨服務器的協調能力

  3. 公平性選擇:支持公平和非公平兩種模式

  4. 可重入:支持同一線程多次獲取許可

  5. 超時機制:支持嘗試獲取許可的超時設置

典型應用場景

  1. 限流控制:限制系統并發請求數

  2. 資源池管理:如數據庫連接池控制

  3. 任務調度:限制同時執行的任務數量

  4. API訪問限制:控制第三方API調用頻率


RCountDownLatch

閉鎖,它允許一個或多個線程等待其他線程完成操作后再繼續執行。

RCountDownLatch latch = redisson.getCountDownLatch("myLatch");// 初始化計數器為5
latch.trySetCount(5);// 減少計數器(每個工作線程完成后調用)
latch.countDown();//獲取當前計數
long remaining = latch.getCount();// 等待計數器歸零(阻塞)
latch.await();// 帶超時的等待
boolean reached = latch.await(10, TimeUnit.SECONDS);

  1. 一次性使用:計數器歸零后不能重置(與JDK的CountDownLatch一致)

  2. 等待/通知機制:線程可以等待計數器歸零

  3. 可視化監控:可通過Redis直接查看當前計數狀態

典型應用場景

  1. 分布式任務同步:等待多個分布式任務完成

  2. 系統初始化:等待所有服務初始化完成

  3. 批量處理:等待所有子任務處理完成

  4. 測試協調:分布式測試中的線程協調


優化三級分類緩存

    @Overridepublic Map<String, List<Level2CategoryVo>> getLevel2AndLevel3Category() {//1.先從緩存中獲取 catalogJsonValueOperations<String,String> valueOperations = redisTemplate.opsForValue();String catalogJson = valueOperations.get("catalogJson");Map<String, List<Level2CategoryVo>> res = null;if(StringUtils.isEmpty(catalogJson)){//緩存中無對應數據,查詢數據庫res = getCatalogJsonFromDBWithRedissonLock();}else{res = JSON.parseObject(catalogJson,new TypeReference<Map<String, List<Level2CategoryVo>> >(){});}return res;}/*** 獲取 Redisson 分布式鎖,查詢數據庫* @return*/private Map<String, List<Level2CategoryVo>> getCatalogJsonFromDBWithRedissonLock(){Map<String, List<Level2CategoryVo>> res = null;RLock lock = redisson.getLock("CatalogJson-Lock");lock.lock();//成功獲取到鎖try {res = getCatalogJsonFromDB();}finally {lock.unlock();}return res;}

緩存一致性問題

雙寫模式

修改數據庫,并修改緩存。

    失效模式

    修改數據庫后,刪除緩存,下一次查詢時緩存數據。

    臟數據解決

    倆種模式都會產生暫時的臟數據,解決方案:

    1. 讀寫鎖
    2. 過期時間,保證最終一致性
    3. 一致性要求高的數據,不存入緩存,應直接查詢數據庫

    本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
    如若轉載,請注明出處:http://www.pswp.cn/web/74245.shtml
    繁體地址,請注明出處:http://hk.pswp.cn/web/74245.shtml
    英文地址,請注明出處:http://en.pswp.cn/web/74245.shtml

    如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

    相關文章

    Linux系統調用編程

    目錄 一. 理解進程和線程的概念。并在Linux系統下進行相應操作 1.1概念 1.1.1進程(Process) 1.1.2 線程(Thread) 1.2操作 1.2.1用 ps -a 命令查看系統中各進程的編號pid 1.2.2用kill 命令終止一個進程pid 二. 解釋Linux的“虛擬內存管理”&#xff0c;它與stm32中的 真…

    25-智慧旅游系統(協同算法)三端

    介紹 技術&#xff1a; 基于 B/S 架構 SpringBootMySQLLayuivue 環境&#xff1a; Idea mysql maven jdk1.8 node 管理端功能 首頁展示圖表&#xff1a;以數據可視化方式展示關鍵業務數據。 用戶管理&#xff1a;管理系統用戶&#xff0c;包括查看、編輯等操作。 供應商管…

    【stm32--HAL庫DMA+USART+空閑中斷不定長收發數據】

    串口通信-Hal庫實現不定長度收發&#xff0c;DMAUSART DMA串口STM32CUBEMX配置&#xff08;工程創建&#xff09;基礎配置時鐘配置工程配置 代碼編寫現象 DMA 在正式配置之前&#xff0c;我們先來一起簡單了解一下DMA。DMA&#xff08;Direct Memory Access&#xff0c;直接內…

    沉浸式體驗測評|AI Ville:我在Web3小鎮“生活”了一周

    最近&#xff0c;我在朋友的推薦下&#xff0c;體驗了 aivillebot 的項目。起初&#xff0c;我只是抱著試試看的心態&#xff0c;心想這不就是個 Web3 版的《星露谷物語》嗎&#xff1f; 但是一周下來&#xff0c;我發現這個虛擬小鎮也沒那么簡單——里面的居民不是目前端游或鏈…

    FPGA學習-基于 DE2-115 板的 Verilog 分秒計數器設計與按鍵功能實現

    一、核心功能設計 按鍵暫停/繼續&#xff1a;通過KEY1控制計時狀態 按鍵消抖處理&#xff1a;20ms消抖周期消除機械抖動 硬件資源分配&#xff1a;符合DE2-115開發板引腳規范 二、核心模塊實現詳解 1. 頂層模塊&#xff08;counter&#xff09; module counter(input CL…

    后端開發 SpringBoot 工程模板

    概述 本篇文章主要記錄如何開發一個通用的 SpringBoot 工程開發框架的項目模板&#xff0c;這樣后續需要開發項目時就可以直接開箱直用了&#xff0c;省區了很多重復步驟。 項目初始化 創建項目&#xff1a; 按照我的選項來選&#xff0c;然后點擊 create&#xff0c;等待文…

    OpenCv(五)——邊緣檢測

    目錄 邊緣檢測 一、sobel算子邊緣檢測 &#xff08;1&#xff09;原理 1、X軸方向的邊緣檢測 2、Y軸方向的邊緣檢測 &#xff08;2&#xff09;sobel算子參數 &#xff08;3&#xff09;X軸方向邊緣檢測代碼演示 1、顯示圓的圖像 2、x方向上的邊緣檢測&#xf…

    無人機數據鏈技術及運行方式詳解!

    一、無人機數據鏈技術要點 1. 通信傳輸技術 頻段選擇&#xff1a; 常用頻段包括 L波段&#xff08;1-2 GHz&#xff09;、C波段&#xff08;4-8 GHz&#xff09;、Ku/K波段&#xff08;12-40 GHz&#xff09;&#xff0c;不同頻段在傳輸距離、帶寬和抗干擾性間權衡。 低…

    AI Agent 實戰:搭建個人在線旅游助手

    AI Agent 實戰&#xff1a;搭建個人在線旅游助手 本次實驗中&#xff0c;我們將繼續探索 Agent 的提示詞&#xff0c;學習更加規范的提示詞撰寫方法。 本實驗中你將掌握的知識點 使用 Dify 構建 Agent 的方法結構化的提示詞撰寫技巧變量的使用方法 1. 準備 在新建 Agent 之…

    檢索增強生成(RAG):強化 AI 智能體的知識 “武裝”

    技術點目錄 第一章、智能體(Agent)入門第二章、基于字節Coze 構建智能體(Agent)第三章、基于其他平臺構建智能體&#xff08;Agent&#xff09;第四章、國內外智能體(Agent)經典案例詳解第五章、大語言模型應用開發框架LangChain入門第六章、基于LangChain的大模型API接入第七章…

    vscode 打開工程 看不到文件目錄

    vscode 打開工程 看不到文件目錄 View->Explorer 快捷鍵&#xff1a;CtrlShiftE

    厘米級定位賦能智造升級:品鉑科技UWB技術驅動工廠全流程自動化與效能躍升”

    在智能制造中的核心價值體現在?高精度定位、流程優化、安全管理?等多個維度&#xff0c;具體應用如下&#xff1a; 一、?核心技術與定位能力? ?厘米級高精度定位? UWB技術通過?納秒級窄脈沖信號?&#xff08;帶寬超500MHz&#xff09;實現高時間分辨率&#xff0c;結合…

    getID3獲取本地或遠程視頻時長

    音頻文件也可使用&#xff0c;使用ffmeg安裝太復雜了 附ffmpeg方式&#xff1a;centos下安裝ffmpeg_yum安裝ffmpeg-CSDN博客 使用composer先安裝 composer require james-heinrich/getid3 獲取本地視頻 //獲取本地視頻$video_path $_SERVER[DOCUMENT_ROOT].$params[video];…

    10、Linux C 網絡編程(完整版)

    1、網絡發展歷史和分層 1.1 Internet 的歷史 起源&#xff1a; 1957 年&#xff1a;蘇聯發射第一顆人造衛星 "Sputnik"。 1958 年&#xff1a;美國總統艾森豪威爾成立 DARPA&#xff08;國防部高級研究計劃署&#xff09;。 1968 年&#xff1a;DARPA 提出 "…

    前端:開源軟件鏡像站 / 清華大學開源軟件鏡像站 / 阿里云 / 網易 / 搜狐

    一、理解開源軟件鏡像站 開源軟件鏡像是指開源軟件在遠程服務器上的備份副本&#xff0c;允許用戶通過互聯網快速下載和安裝所需的軟件。在國內&#xff0c;有多個知名的開源軟件鏡像站&#xff0c;為開發者提供穩定、快速的開源軟件下載服務。 二、常見開源軟件鏡像站 序號…

    Oracle 數據庫中優化 INSERT INTO 操作的性能

    在 Oracle 數據庫中優化 INSERT INTO 操作的性能&#xff0c;尤其是在處理大批量數據時&#xff0c;可以通過以下方法顯著提升效率。 使用直接路徑插入&#xff08;Direct-Path Insert&#xff09; 通過 APPEND 提示繞過緩沖區緩存&#xff0c;直接寫入數據文件&#xff0c;減…

    嵌入式硬件篇---嘉立創PCB繪制

    文章目錄 前言一、PCB繪制簡介1.1繪制步驟1.1.1前期準備1.1.2原理圖設計1.1.3原理圖轉PCB1.1.4PCB布局1.1.5布線1.1.6布線優化和絲印1.1.7制版 1.2原理1.2.1電氣連接原理1.2.2信號傳輸原理1.2.3電源和接地原理 1.3注意事項1.3.1元件封裝1.3.2布局規則1.3.3過孔設計1.3.4DRC檢查…

    ideal自動生成類圖的方法

    在 IntelliJ IDEA 中&#xff0c;“**在項目資源管理器中選擇以下類**” 是指通過 **項目資源管理器&#xff08;Project Tool Window&#xff09;** 找到并選中你需要生成類圖的類文件&#xff08;如 .java 文件&#xff09;&#xff0c;然后通過右鍵菜單或快捷鍵操作生成類圖…

    【零基礎入門unity游戲開發——2D篇】2D物理關節 —— Joint2D相關組件

    考慮到每個人基礎可能不一樣,且并不是所有人都有同時做2D、3D開發的需求,所以我把 【零基礎入門unity游戲開發】 分為成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要講解C#的基礎語法,包括變量、數據類型、運算符、流程控制、面向對象等,適合沒有編程基礎的…

    在Vue 3 + TypeScript + Vite 項目中安裝和使用 SCSS

    在Vue 3 TypeScript Vite 項目中安裝和使用 SCSS 1、安裝 SCSS 的相關依賴 npm install sass --save-dev2、配置 Vite 對于 Vue 3&#xff0c;Vite 已經內置了對 SCSS 的支持&#xff0c;通常不需要額外的配置。但是&#xff0c;如果需要自定義配置&#xff0c;可以在路徑…