Redis 緩存和 Redis 分布式鎖

目錄

Redis 緩存 (Caching)

目的

核心邏輯

? ? ? ? ?存儲形式總結

典型場景

Redis 分布式鎖 (Distributed Lock)

目的

核心作用

核心邏輯

典型場景

核心區別總結


Redis 緩存 (Caching)

在Redis中,數據是以鍵值對的形式存儲的,其中鍵總是字符串類型,而值可以是多種數據類型。

目的

加速數據訪問,減少對慢速數據源(如數據庫)的頻繁查詢,提升系統性能和吞吐量。

核心邏輯
  1. 讀操作

    • 應用優先從 Redis 讀取數據。

    • 若 Redis 中無數據(緩存未命中),則查詢數據庫,并將結果寫入 Redis。

  2. 寫操作

    • 更新數據庫后,同步或異步更新/失效 Redis 中的緩存(如?DEL key?或?SET key new_value)。

存儲形式總結
數據類型底層實現最大元素數特點
StringSDS 動態字符串512 MB支持文本/二進制數據
Hash
  • 哈希表或 ziplist
232-1 個字段高效存儲對象屬性
List雙向鏈表/ziplist232-1 個元素保持插入順序
Set哈希表或 intset232-1 個元素自動去重
Sorted Set跳表 + 哈希表232-1 個元素按分數排序
GeospatialSorted Set同 Sorted Set支持地理坐標計算
Streamrax 樹理論無上限支持消費者組
BitmapString232 位超高效布爾存儲
HyperLogLog專用結構理論無上限固定12KB內存存儲巨大基數
// 設置過期時間
db.KeyExpire("temp_data", TimeSpan.FromMinutes(30));// 滑動過期
db.StringSet("session:1001", data, TimeSpan.FromMinutes(20), when: When.Always);
典型場景
  • 高頻讀取的熱點數據(如商品信息、用戶資料)

  • 減輕數據庫壓力

  • 加速 API 響應

Redis 分布式鎖 (Distributed Lock)

目的

協調分布式系統中多個進程/服務的并發操作,確保同一時刻只有一個客戶端能執行關鍵邏輯(如資源修改),避免數據競爭。

核心作用

Redis 分布式鎖用于解決分布式系統中的并發沖突問題,主要作用包括:

  1. 資源互斥訪問
    確保多個服務實例/進程同時操作共享資源(如數據庫、文件)時,同一時刻只有一個客戶端能執行關鍵代碼。

    例:避免庫存超賣、重復支付、文件覆蓋等問題。

  2. 協調分布式任務
    保證定時任務、批處理操作在集群環境中只被執行一次。

  3. 防止并發副作用
    避免多個請求同時修改同一數據導致狀態不一致

核心邏輯
  1. 加鎖

    • 客戶端嘗試在 Redis 中創建一個唯一鍵(如?lock:order_123),通過原子操作(如?SET key random_value NX PX 30000)確保互斥性。

  2. 執行業務邏輯

    • 只有成功獲得鎖的客戶端才能執行后續操作(如扣減庫存)。

  3. 解鎖

    • 完成后刪除該鍵(需通過 Lua 腳本驗證值,避免誤刪其他客戶端的鎖)。

典型場景
  • 分布式系統下的資源互斥訪問(如訂單支付、庫存扣減)

  • 防止重復任務調度(如定時任務只在一個節點執行)

// 示例:使用 Redlock 或 StackExchange.Redis 鎖
var redisLock = _redis.AcquireLock("lock:order_123", TimeSpan.FromSeconds(30));
try
{if (redisLock.IsAcquired){// 執行業務邏輯(如扣減庫存)_stockService.ReduceStock(productId, 1);}
}
finally
{redisLock?.Release(); // 釋放鎖
}

類庫中用到的包是RedLockNet:

//鎖信息集合
var trayBarcodeLockInfos = new List<IRedLock>(); 
try{//獲取鎖var lockInfo = await _redLockLead.AcquireLockAsync(moveTrayBalance.TrayBarcode);_ = !lockInfo.IsAcquired ? throw new BusinessException(message: _localizer["_TrayBarcodeRequestExist", moveTrayBalance.TrayBarcode]) : false;trayBarcodeLockInfos.Add(lockInfo); //獲取鎖成功 將鎖加入集合中//執行業務邏輯··········}catch (BusinessException ex){} 
finally{//釋放鎖foreach (var lockInfo in trayBarcodeLockInfos){await _redLockLead.ReleaseLockAsync(lockInfo);}}

AcquireLockAsync() 獲取鎖 獲取不到返回失敗?

IsAcquired() 代表是否獲取鎖成功?

/// <summary>
/// 獲取鎖(獲取不到立即返回失敗)
/// </summary>
/// <param name="lockKey"></param>
/// <returns></returns>
public virtual async Task<IRedLock> AcquireLockAsync(string lockKey)
{var redLock = await _factoryProvider.RedLockFactoryInstance.CreateLockAsync(lockKey, _defaultKeyExpiry);return redLock;
}
/// <summary>
/// 獲取鎖(阻塞直到獲取鎖成功或者1h后仍獲取不到,返回失敗)
/// </summary>
/// <param name="lockKey"></param>
/// <returns></returns>
public virtual async Task<IRedLock> AcquireLockUntilSuccessAsync(string lockKey)
{var redLock = await _factoryProvider.RedLockFactoryInstance.CreateLockAsync(lockKey, _defaultKeyExpiry, _wait, _retry);return redLock;
}public async Task<IRedLock> CreateLockAsync(string resource, TimeSpan expiryTime, TimeSpan waitTime, TimeSpan retryTime, CancellationToken? cancellationToken = null)
{return await RedLock.CreateAsync(loggerFactory.CreateLogger<RedLock>(), redisCaches, resource, expiryTime, waitTime, retryTime, configuration.RetryConfiguration, cancellationToken ?? CancellationToken.None).ConfigureAwait(continueOnCapturedContext: false);
}

默認為每10秒嘗試一次,在嘗試了一小時后還獲取不到鎖的話,就返回失敗

/// <summary>
/// 釋放鎖
/// </summary>
/// <param name="redLock"></param>
/// <returns></returns>
public virtual async Task ReleaseLockAsync(IRedLock redLock)
{await redLock.DisposeAsync();
}

核心區別總結

特性Redis 緩存Redis 分布式鎖
核心目標提升讀取性能,降低數據庫壓力解決分布式系統并發沖突
數據性質存儲業務數據(如用戶信息)存儲鎖狀態(臨時性、非業務數據)
讀寫模式高頻讀、低頻寫短期占用、立即釋放
生命周期可長期存在(有過期時間)臨時存在(任務結束即釋放)
關鍵命令GET/SET/DEL/EXPIRESET NX PX/EVAL(Lua 解鎖)
數據一致性需處理緩存與數據庫一致性(如雙寫策略)需確保鎖的互斥性和安全性(如 Redlock)
  • 鎖是協調機制,不存儲業務數據;緩存是數據副本,兩者不可互換。

  • 緩存僅加速數據讀取,無法控制并發寫操作(如超賣問題仍需分布式鎖或數據庫事務)。

實際系統中二者常結合使用

  • 讀場景:用?Redis 緩存加速數據訪問。

  • 寫場景:用?Redis 分布式鎖保護共享資源,確保數據一致性。

適用場景不適用場景
庫存扣減/秒殺系統高頻短操作(鎖開銷 > 業務開銷)
分布式任務調度強一致性要求極高的金融交易
防止重復提交單機應用(用 Monitor 即可)
跨服務共享資源協調讀多寫少場景(用樂觀鎖更優)

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

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

相關文章

[ java 基礎 ] 了解編程語言的第一步

目錄 一. IDE (1). 使用IDE的原因: (2). 創建和使用: (3). 常用快捷方式與設置 (4). 注釋 (5). 關鍵字 (6). 標識符 (7). 變量 (8). 數據類型 1) 整數類型 2) 浮點類型 3) 布爾類型(boolean) 4) 字符類型(char) 5) 字符串 6) 基本數據類之間的轉換 (9). 運算符…

JavaScript 閉包與遞歸深度解析:從理論到實戰

本文將系統梳理 JavaScript 中閉包與遞歸的核心概念、實戰應用及面試要點,涵蓋課堂知識點、作業實現、面試題解析等內容,幫助你全面掌握這兩大重要概念。 一、閉包:函數與變量的綁定藝術 1.1 閉包的定義與核心特性 閉包是 JavaScript 中一種特殊的語言現象,其核心定義可…

牛 CDR3 單抗:抗病毒領域的 “納米級精準導彈”

一、病毒防御的天然克星病毒感染的核心難題在于其表面的 “糖衣炮彈”—— 以 HIV 為例&#xff0c;其 Env 蛋白表面密集的糖鏈形成物理屏障&#xff0c;傳統抗體難以穿透。而牛 CDR3 單抗的超長 CDR H3 結構&#xff08;50-60 個氨基酸&#xff09;如同 “納米探針”&#xff…

鴻蒙應用開發和Vue網頁開發中生命周期的區別

因為下節課就可以寫講解兩者生命周期代碼的實戰了&#xff0c;寫介紹一下理論方面的區別&#xff1a;鴻蒙應用開發&#xff08;ArkUI范式&#xff09;與Vue網頁開發在生命周期管理上的核心區別&#xff0c;這直接反映了原生OS應用與Web應用在架構哲學和運行環境上的根本差異??…

基于SpringBoot+Vue的輕手工創意分享平臺(WebSocket即時通訊、協同過濾算法、Echarts圖形化分析)

&#x1f388;系統亮點&#xff1a;WebSocket即時通訊、協同過濾算法、Echarts圖形化分析&#xff1b;一.系統開發工具與環境搭建1.系統設計開發工具后端使用Java編程語言的Spring boot框架 項目架構&#xff1a;B/S架構 運行環境&#xff1a;win10/win11、jdk17前端&#xff1…

Java應屆生求職八股(5)---并發編程篇

線程基礎線程與進程的區別進程是程序的一次執行過程。它資源分配的單位。線程是程序執行的單位。并行和并發的區別單核CPU下&#xff0c;線程串行。&#xff08;并發&#xff1a;多線程輪流使用一個或多個CPU&#xff09;多核CPU下&#xff0c;每個核都可調度線程。&#xff08…

WSL 配置文件 wsl.conf 設置

WSL .wslconfig 小技巧 要在 WSL&#xff08;Windows Subsystem for Linux&#xff09;中增加內存&#xff0c;你需要編輯 WSL 配置文件 wsl.conf 或者直接調整虛擬機的資源限制。 文章目錄WSL .wslconfig 小技巧以下是步驟&#xff1a; 找到或創建 .wslconfig 文件&#xff1…

9.從零開始寫LINUX內核——設置中斷描述符表

Linux 0.12 內核中斷描述符表&#xff08;IDT&#xff09;完整實現代碼以下是基于 setup 程序擴展的完整代碼&#xff0c;包含中斷描述符表&#xff08;IDT&#xff09;的定義、初始化及中斷處理程序&#xff0c;可直接用于實驗驗證&#xff1a;asm/* setup.s —— 4 扇區&…

手機實時提取SIM卡打電話的信令聲音-當前現狀與思考

手機實時提取SIM卡打電話的信令聲音-當前現狀與思考 --純手機-無外置配件的方案規劃 上一篇&#xff1a;手機實時提取SIM卡打電話的信令聲音-新的篇章(篇外小結與思考) 下一篇&#xff1a;手機實時提取SIM卡打電話的信令聲音-整體解決方案規劃 一、前言 我們在2024年09月的…

【車聯網kafka】常用參數及其命令總結(第八篇)

目錄 1、kafka參數 1.1 、消費者消息批次發送 1.2 、消息大小的配置(環環相扣的消息大小&#xff0c;調整時需要一起調整) 1.3 、消息重試發送冪等 1.4、消息提交 1.5、分區分配策略&#xff08;自己看的設置&#xff09; 1.6、文件存儲 2、kafka命令 2.1 常用命令一覽…

基于Spring Boot 4s店車輛管理系統 租車管理系統 停車位管理系統 智慧車輛管理系統

&#x1f525;作者&#xff1a;it畢設實戰小研&#x1f525; &#x1f496;簡介&#xff1a;java、微信小程序、安卓&#xff1b;定制開發&#xff0c;遠程調試 代碼講解&#xff0c;文檔指導&#xff0c;ppt制作&#x1f496; 精彩專欄推薦訂閱&#xff1a;在下方專欄&#x1…

17.4 合并購物車

分析 用戶登錄后&#xff0c;將Cookie中的購物車商品合并到redis數據庫中。如果此時redis中已經有相同id的商品&#xff0c;則使用Cookie中的數據覆蓋redis中的數據。 合并功能需要在用戶登錄后實現&#xff0c;但登錄視圖中應避免過多與登錄邏輯無關的邏輯&#xff0c;所以考慮…

RK3588消費級8K VR一體機 是否有坑?

??芯片平臺????定位場景????核心優勢????消費級功能性短板??全志H8/RK3288入門級VR低成本、基礎性能穩定算力弱&#xff08;4*A55&#xff09;、無NPU、顯示分辨率僅1080P高通XR1中端VR/AR均衡性能&#xff08;Adreno 615 GPU&#xff09;僅WiFi5、續航≤4小時…

基于Spring Boot校園二手交易平臺系統設計與實現 二手交易系統 交易平臺小程序

&#x1f525;作者&#xff1a;it畢設實戰小研&#x1f525; &#x1f496;簡介&#xff1a;java、微信小程序、安卓&#xff1b;定制開發&#xff0c;遠程調試 代碼講解&#xff0c;文檔指導&#xff0c;ppt制作&#x1f496; 精彩專欄推薦訂閱&#xff1a;在下方專欄&#x1…

Nginx 服務器常用操作

一. Nginx 常用配置 1. Nginx 總配置文件 nginx 安裝目錄下的 nginx.conf 文件: # 指定 Nginx worker 進程運行的系統用戶 user nginx; # 自動根據 CPU 核心數啟動相應數量的 worker 進程&#xff0c;充分利用多核。 worker_processes auto; # 自動將 worker 進程綁定到特定 …

PHP官方及第三方下載地址全指南(2025最新版)

PHP官方及第三方下載地址全指南&#xff08;2025最新版&#xff09; 本文整理了PHP官方及主流第三方下載渠道&#xff0c;包含PHP 5.5至8.4各版本的直接下載鏈接&#xff0c;助您快速獲取安全可靠的PHP環境。 一、PHP官方下載渠道 1.1 全球主站下載 網址&#xff1a;https://…

深度剖析Redisson分布式鎖項目實戰

今天在練手項目中也是遇到了許多新的技術&#xff0c;其中我認為最深刻的還是Redisson分布式鎖&#xff0c;這里我就結合一下我項目中用到Redisson分布式鎖的代碼來講述一下Redisson分布式鎖&#xff0c;希望可以幫助大家更深刻地理解這項技術。在之前的文章中我已經講過Rediss…

第四天-創建一個Classic CAN(經典CAN2.0)/CANFD的系統描述ARXML文件

【ARXML專題】-構建CAN/CANFD通信系統:ARXML實戰指南 汽車神經系統的"高速公路" 想象一輛現代汽車如同人體,電子控制單元(ECU)是器官,而CAN總線就是連接它們的神經系統。在自動駕駛時代,傳統CAN2.0的"鄉間小路"已無法滿足數據傳輸需求,CANFD的"…

用架構建模工具Sparx EA繪制企業轉型路線圖

企業數字化轉型面臨諸多挑戰&#xff1a;信息壁壘導致各部門協同困難&#xff0c;資源投入缺乏科學評估&#xff0c;潛在風險難以提前預判。這些問題不僅拖慢轉型進程&#xff0c;還可能引發高昂的試錯成本。 本文將闡述如何運用架構建模工具Sparx EA的核心功能——可視化路線…

STM32——GPIO

總 &#xff1a;STM32——學習總綱 參考資料&#xff1a; STM32F1系列參考手冊-V10&#xff08;中&#xff09; 一、GPIO簡介 1.1 GPIO 特點 1.2 GPIO 電氣特性* stm32芯片資料STM32F103ZET6(English) 1.3 GPIO 引腳分布 電源引腳&#xff1a;V開頭 晶振引腳&#xff1a; …