Redis分布式鎖詳解

Redis分布式鎖詳解

分布式鎖是在分布式系統中實現互斥訪問共享資源的重要機制。Redis因其高性能和原子性操作特性,常被用來實現分布式鎖。

一、基礎實現方案

1. SETNX + EXPIRE方案(基本版)

# 加鎖
SETNX lock_key unique_value  # 設置唯一標識
EXPIRE lock_key 10          # 設置過期時間# 解鎖
DEL lock_key                # 刪除鍵

問題

  • 非原子性操作(SETNX和EXPIRE分開執行可能失敗)
  • 可能誤刪其他客戶端的鎖

2. SET擴展命令方案(推薦)

# 原子性加鎖
SET lock_key unique_value NX PX 10000  # NX表示不存在才設置,PX設置毫秒級過期時間# 解鎖(Lua腳本保證原子性)
if redis.call("get",KEYS[1]) == ARGV[1] thenreturn redis.call("del",KEYS[1])
elsereturn 0
end

優勢

  • 原子性加鎖
  • 設置過期時間防止死鎖
  • 通過唯一值避免誤刪

二、Redlock算法(多節點版)

當需要更高可靠性時,Redis作者提出的Redlock算法:

  1. 獲取當前時間(毫秒)
  2. 依次嘗試從N個獨立的Redis節點獲取鎖
  3. 計算獲取鎖總耗時(小于鎖過期時間)
  4. 當從多數節點(N/2+1)獲取成功,且總耗時小于鎖有效時間,才認為加鎖成功
  5. 若失敗,向所有節點發起解鎖請求

三、Java實現示例(Redisson)

// 1. 獲取鎖對象
RLock lock = redissonClient.getLock("myLock");try {// 2. 嘗試加鎖(參數:等待時間,鎖自動釋放時間,時間單位)boolean isLocked = lock.tryLock(10, 30, TimeUnit.SECONDS);if (isLocked) {// 3. 執行業務代碼doBusiness();}
} finally {// 4. 釋放鎖lock.unlock();
}

四、關鍵問題與解決方案

1. 鎖續期(Watchdog機制)

問題:業務執行時間超過鎖過期時間
方案:Redisson的看門狗會定期(默認10秒)檢查并延長鎖時間

2. 可重入性

方案:使用計數器記錄重入次數(Redisson已實現)

3. 鎖等待與公平性

方案

  • 實現鎖等待隊列
  • 使用Redis的List結構模擬隊列

4. 主從切換問題

問題:主節點崩潰可能導致鎖丟失
方案

  • 使用Redlock多節點方案
  • 或使用Redis的WAIT命令確保數據同步

五、生產環境建議

  1. 鎖命名規范業務:資源:操作order:123:pay
  2. 超時時間設置
    • 不宜過短(業務未完成鎖已釋放)
    • 不宜過長(系統故障時恢復慢)
  3. 監控指標
    • 鎖獲取成功率
    • 平均持有時間
    • 等待隊列長度
  4. 降級方案:Redis不可用時切換本地鎖或數據庫鎖

六、與其他方案對比

方案優點缺點適用場景
Redis鎖性能高、實現簡單可靠性依賴Redis大多數分布式場景
Zookeeper鎖可靠性高性能較低強一致性要求場景
數據庫鎖無需額外組件性能差、有死鎖風險簡單場景

七、最佳實踐

  1. 始終為鎖設置合理的過期時間
  2. 使用唯一標識(UUID/線程ID)作為鎖值
  3. 釋放鎖前驗證持有者身份
  4. 考慮使用成熟的客戶端(如Redisson)而非自己實現
  5. 重要業務實現鎖續期機制

Redis分布式鎖在大多數場景下能很好工作,但對于對可靠性要求極高的場景,建議考慮Zookeeper或etcd等強一致性協調服務實現的分布式鎖。

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

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

相關文章

創建Linux虛擬環境并遠程連接,finalshell自定義壁紙

安裝VMware 這里不多贅述。 掛載Linux系統 1). 打開Vmware虛擬機,打開 編輯 -> 虛擬網絡編輯器(N) 選擇 NAT模式,然后選擇右下角的 更改設置。 設置子網IP為 192.168.100.0,然后選擇 應用 -> 確定。 解壓 CentOS7-1.zip 到一個比較大…

podman和與docker的比較 及podman使用

Podman 與 Docker 的比較和區別 架構差異 Docker:采用客戶端 - 服務器(C/S)架構,有一個以 root 權限運行的守護進程 dockerd 來管理容器的生命周期。客戶端(docker 命令行工具)與守護進程進行通信&#x…

【Easylive】HttpServletRequest、HttpServletResponse、HttpSession 介紹

【Easylive】項目常見問題解答(自用&持續更新中…) 匯總版 這三個是 Java Web 開發(Servlet/JSP)的核心接口,用于處理 HTTP 請求和響應 以及 用戶會話管理。它們在 Spring MVC(Controller)中…

Markdown使用說明

以下是Markdown基礎使用教程及分割線展示方法: 📝 Markdown基礎使用教程 1. 標題 # 一級標題 ## 二級標題 ### 三級標題2. 文本樣式 *斜體* 或 _斜體_ **加粗** 或 __加粗__ ***加粗斜體*** 或 ___加粗斜體___ ~~刪除線~~3. 列表 - 無序列表項 * 另一…

Jmeter的壓測使用

Jmeter基礎功能回顧 一、創建Jmeter腳本 1、錄制新建 (1)適用群體:初學者 2、手動創建 (1)需要了解Jmeter的常用組件 元件:多個類似功能組件的容器(類似于類) 各元件作用 組件…

【rabbitmq基礎】

RabbitMq基礎 1.概念2.數據隔離3.使用控制臺向mq傳遞消息1.創建兩個隊列-“測試隊列”,“測試隊列2”2.創建一個交換機-"測試交換機"3.測試發送消息3.1讓交換機和隊列進行綁定3.2發送消息3.3查看消息 4.創建虛擬主機5.java使用rabbitmq5.1 發送消息5.2 消…

加固計算機廠家 | 工業加固筆記本電腦廠家

北京魯成偉業科技發展有限公司(以下簡稱“魯成偉業”)成立于2005年,是集研發、生產、銷售與服務于一體的高新技術企業,專注于加固計算機、工業加固筆記本電腦及特種計算機的研發與制造。憑借20年的技術積累與行業深耕,…

鏈路聚合配置命令

技術信息 加入捆綁組,加大鏈路間帶寬等 配置命令 華三 靜態聚合 將接口加入聚合口后再進行配置 //創建靜態鏈路聚合口1,不啟用lacp[SWB]interface Bridge-Aggregation 1 [SWB-Bridge-Aggregation1]port link-type trunk [SWB-Bridge-Aggregation…

ekf-imu --- 四元數乘法符號 ? 的含義

? 表示四元數的乘法運算: 用于組合兩個四元數代表的旋轉。四元數乘法是非交換的(即順序不同結果不同),其定義如下: 若兩個四元數分別為: qq0q1iq2jq3k, pp0p1ip2jp3k, 則它們的乘積為:4*1 …

論文閱讀Diffusion Autoencoders: Toward a Meaningful and Decodable Representation

原文框架圖: 官方代碼: https://github.com/phizaz/diffae/blob/master/interpolate.ipynb 主要想記錄一下模型的推理過程 : %load_ext autoreload %autoreload 2 from templates import * device cuda:1 conf ffhq256_autoenc() # pri…

OpenVLA-OFT——微調VLA的三大關鍵設計:并行解碼、動作分塊、連續動作表示以及L1回歸目標

前言 25年3.26日,這是一個值得紀念的日子,這一天,我司「七月在線」的定位正式升級為了:具身智能的場景落地與定制開發商 ,后續則從定制開發 逐步過渡到 標準產品化 比如25年q2起,在定制開發之外&#xff0…

【論文閱讀】Dynamic Adversarial Patch for Evading Object Detection Models

一、介紹 這篇文章主要是針對目標檢測框架的攻擊,不同于現有的攻擊方法,該論文主要的側重點是考慮視角的變化問題,通過在車上布置多個顯示器,利用視角動態選擇哪一個顯示器播放攻擊內容,通過這種方法達到隱蔽與攻擊的…

多模態技術概述(一)

1.1 多模態技術簡介 1.1.1 什么是多模態 多模態(Multimodal)涉及多種不同類型數據或信號的處理和融合,每種數據類型或信號被稱為一種模態。常見的模態包括文本、圖像、音頻、視頻等。多模態技術旨在同時利用這些不同模態的數據,以實現更全面、更準確的理…

nginx2

Nginx反向代理(七層代理)、Nginx的TCP/UDP調度器(四層代理)、 一、Nginx反向代理(七層代理) 步驟&#xff1a; ? 部署后端web服務器集群 ? 配置Nginx代理服務器 ? 配置upstream集群池 ? 調節集群池權重比 <img src"/home/student/Deskt…

調用kimi api

官網支持python&#xff0c;curl和node.js 因為服務器剛好有php環境&#xff0c;所以先用curl調個普通的語音溝通api <?php // 定義 API Key 和請求地址 define(MOONSHOT_API_KEY, sk-PXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXgk1); define(MOONSHOT_API_URL, https://…

關于 UPDATE 語句 和 SELECT ... FOR UPDATE 的對比分析,包括語法、功能、鎖機制、使用場景及示例代碼

以下是關于 UPDATE 語句 和 SELECT ... FOR UPDATE 的對比分析&#xff0c;包括語法、功能、鎖機制、使用場景及示例代碼&#xff1a; 1. UPDATE 語句 功能 直接修改數據&#xff1a;立即更新表中的數據&#xff0c;并提交修改。無顯式鎖&#xff1a;雖然會自動加鎖&#xff…

在航電系統中提高可靠性的嵌入式軟件設計

1.總線余度設計 數據傳輸采用雙余度總線設計&#xff0c;CANFD為主&#xff0c;RS485為備。發送方將相同的數據分別通過雙總線來發送&#xff0c;接收方優先處理主線數據。由于總線上數據頻率固定&#xff0c;可設置定時器監控主總線的數據&#xff0c;當定時器超時后&#xff…

第十五屆藍橋杯大賽軟件賽省賽Python 大學 C 組:5.回文數組

題目1 回文數組 小藍在無聊時隨機生成了一個長度為 n 的整數數組&#xff0c;數組中的第 i 個數為 ai&#xff0c;他覺得隨機生成的數組不太美觀&#xff0c;想把它變成回文數組&#xff0c;也是就對于任意 i∈[1,n] 滿足 a i a n ? i 1 a_ia_{n?i}1 ai?an?i?1。 小藍…

netty中的WorkerGroup使用詳解

Netty中WorkerGroup的深度解析 WorkerGroup是Netty線程模型中的從Reactor線程組&#xff0c;負責處理已建立連接的I/O讀寫、編解碼及業務邏輯執行。其設計基于主從多Reactor模型&#xff0c;與BossGroup分工協作&#xff0c;共同實現高并發網絡通信的高效處理。 一、WorkerGro…

模運算核心性質與算法應用:從數學原理到編程實踐

目錄 &#x1f680;前言&#x1f31f;數學性質&#xff1a;模運算的理論基石&#x1f4af;基本定義&#xff1a;余數的本質&#x1f4af;四則運算規則&#xff1a;保持同余性的關鍵 &#x1f99c;編程實踐&#xff1a;模運算的工程化技巧&#x1f4af;避免數值溢出&#xff1a;…