ZooKeeper vs Redis:分布式鎖的實現與選型指南

一、Redis 分布式鎖:追求極致的性能

Redis 分布式鎖基于內存操作,其核心思想是在內存中設置一個唯一的鍵值對來表示鎖的持有。

1. 基礎實現(SETNX + Lua)

最簡單的實現是使用 SETNX(SET if Not eXists)命令:
加鎖:設置一個鍵,值為隨機值,并設置過期時間(防止死鎖)
SET lock_resource_name my_random_value NX PX 30000

#解鎖:使用Lua腳本保證原子性(檢查值再刪除)
if redis.call(“get”, KEYS[1]) == ARGV[1] then
return redis.call(“del”, KEYS[1])
else
return 0
end

2. 生產環境推薦(Redisson框架)

在實際生產中,強烈推薦使用 Java 的 Redisson 庫,它解決了基礎實現的諸多痛點:

? 看門狗機制(Watchdog):異步續期線程,在業務執行期間自動為鎖續期,避免業務未完成而鎖自動過期的問題。

? 可重入鎖:支持同一線程多次加鎖。

? Lua腳本原子性:所有操作都使用Lua腳本,保證原子性。
// Redisson 示例
RLock lock = redissonClient.getLock(“myLock”);
try {
lock.lock();
// … 執行業務邏輯
} finally {
lock.unlock();
}

3. Redis鎖的優勢與劣勢

? 優勢:

  • 性能極高:基于內存操作,吞吐量大,延遲低,適用于高并發場景(如秒殺)。

  • 實現簡單:API 直觀易懂,部署方便。

  • 功能豐富:通過 Redisson 支持多種鎖類型(可重入、公平、讀寫鎖)。

? 劣勢:

  • 一致性依賴:在 Redis 主從異步復制架構下,如果主節點宕機且鎖信息未同步到從節點,可能導致鎖失效,出現多個客戶端同時持有鎖的情況(盡管 Redlock 算法試圖解決此問題,但仍有爭議)。

  • 非強一致性:本質上是 AP 系統,優先保證可用性,在網絡分區時可能犧牲一致性。

二、ZooKeeper 分布式鎖:追求絕對的可靠

ZooKeeper 是一個分布式協調服務,其分布式鎖基于 臨時順序節點 和 Watch 機制,實現了強一致性。

1. 核心實現(臨時順序節點 + Watch)

? 加鎖:所有客戶端在同一個鎖目錄(如 /locks/mylock)下創建臨時順序節點。

? 排隊:客戶端獲取目錄下所有子節點,判斷自己創建的節點是否為序號最小的。

? 監聽:如果不是最小的,客戶端只需監聽(Watch)比自己序號小的前一個節點的刪除事件,而無需監聽所有節點。

? 解鎖:當前一個節點被刪除(即鎖被釋放)時,ZooKeeper 會精準通知下一個客戶端,使其獲得鎖。

2. 生產環境推薦(Curator框架)

Apache Curator 庫封裝了 ZooKeeper 的復雜邏輯,提供了開箱即用的分布式鎖。
// Curator 示例
InterProcessMutex lock = new InterProcessMutex(client, “/locks/mylock”);
try {
if (lock.acquire(10, TimeUnit.SECONDS)) {
// … 執行業務邏輯
}
} finally {
lock.release();
}

  1. ZooKeeper鎖的優勢與劣勢

? 優勢:

? 強一致性(CP):基于 ZAB 協議,數據在集群內強一致,鎖模型非常可靠,不會出現腦裂導致的雙重加鎖。

? 自動釋放:鎖與客戶端 Session 綁定,如果客戶端宕機,其創建的臨時節點會自動刪除,鎖也隨之釋放,有效避免了死鎖。

? 公平鎖:節點順序生成,天然實現了公平的先來后到機制。

? 無驚群效應:通過 Watch 機制精準通知下一個等待者,避免了同時爭搶。

? 劣勢:

? 性能較低:每次加解鎖都需要創建、刪除節點,涉及網絡通信和磁盤寫入(日志),性能遠低于 Redis。

? 運維復雜:需要額外維護一個 ZooKeeper 集群,增加了系統復雜度。

三、核心差異對比一覽表

特性維度 Redis 分布式鎖 ZooKeeper 分布式鎖

一致性模型 最終一致性 (AP) 強一致性 (CP)

性能 高 (內存操作) 低 (需持久化日志)

可靠性 依賴配置和算法 (如 Redlock) 高 (基于 ZAB 協議)

鎖釋放 依賴超時 (手動或看門狗) 自動釋放 (臨時節點)

鎖類型 非公平鎖 (可配置公平鎖) 公平鎖 (順序節點)

驚群效應 可能發生 可避免 (精準Watch)

運維成本 低 (通常已有Redis) 高 (需維護ZK集群)

四、選型建議:如何選擇?

選擇沒有絕對的對錯,只有適合與否。

選擇 Redis 鎖的場景:

? 高并發、高性能需求是首要目標(如秒殺、搶購、緩存擊穿)。

? 可以接受極小概率下的鎖失效(如業務邏輯有冪等性等補償措施)。

? 系統已經部署了 Redis,希望減少外部依賴。

選擇 ZooKeeper 鎖的場景:

? 絕對可靠比性能更重要(如金融交易、核心賬務、主備選舉)。

? 鎖持有時間較長的業務流程,不希望引入復雜的超時和續期機制。

? 系統已經依賴 ZooKeeper 做其他協調服務(如配置中心、服務發現)。

一言以蔽之:追求極致性能用 Redis,追求絕對可靠用 ZooKeeper。

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

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

相關文章

vue基于Springboot框架的考研咨詢平臺系統實現

目錄前言-本系統介紹已開發項目效果實現截圖開發技術詳細介紹核心代碼參考示例1.建立用戶稀疏矩陣,用于用戶相似度計算【相似度矩陣】2.計算目標用戶與其他用戶的相似度系統測試總結源碼獲取詳細視頻演示或者查看其他版本:文章底部獲取博主聯系方式&…

蘋果用戶速更新!macOS存嚴重漏洞,用戶隱私數據面臨泄露風險

漏洞概況近日,macOS系統發現一個CVSS評分高達 9.8 的高危漏洞,該漏洞可能允許應用程序繞過系統保護機制,非法訪問受保護的用戶數據。該漏洞編號為 CVE-2025-24204,目前已有概念驗證(PoC)代碼公開。漏洞影響…

海盜王64位dx9客戶端修改篇之五

在海盜王3.0客戶都升級64位dx9版本的過程中,因為特效的問題,被卡殼了很久。 開始是精靈草的粒子效果、白銀城的煙囪煙霧效果、篝火的效果、陽光透射效果、海浪效果等,修了很長的時間,才找到竅門弄好。 然后是精靈效果、角色陰影。…

Linux學習——管理網絡安全(二十一)

一、管理服務器防火墻(firewalld)RHEL 默認使用 firewalld 作為防火墻管理工具,它通過 “區域(zone)” 和 “服務(service)” 的概念簡化規則配置,支持動態更新規則而無需重啟服務。…

leetcode-python-1941檢查是否所有字符出現次數相同

題目: 給你一個字符串 s ,如果 s 是一個 好 字符串,請你返回 true ,否則請返回 false 。 如果 s 中出現過的 所有 字符的出現次數 相同 ,那么我們稱字符串 s 是 好 字符串。 示例 1: 輸入:s “…

Snort的介紹

當然可以。以下是對 Snort 的全面介紹,涵蓋其定義、核心功能、三種運行模式、工作原理、規則系統以及應用場景等內容。 Snort 網絡入侵檢測系統(NIDS)詳解 一、Snort 簡介 Snort 是一款開源的、輕量級但功能強大的 網絡入侵檢測與防御系統&…

滴滴二面準備(一)

結合你的簡歷內容和技術面試問題,以下是一個結構化的回答建議,突出你的技術深度和項目經驗:2. 項目與實習經歷 得物低代碼落地頁編輯器(核心項目) 背景:解決軟廣落地頁開發周期長、迭代慢問題。技術方案&am…

socket通信在Windows和Linux上的區別

前言 筆者在將socket通信的自定義類從Linux移植到Windows時遇到一些問題&#xff0c;整理下來希望幫助到需要的人&#xff0c;同時也加深自己的理解。 差異 頭文件 #ifdef _WIN32 #include <ws2tcpip.h> #define inet_pton InetPton #define SHUT_RDWR SD_BOTH #define M…

一款將PDF轉化為機器可讀格式的工具介紹

ps:以下內容來自MinerU項目 MinerU 項目簡介 MinerU是一款將PDF轉化為機器可讀格式的工具&#xff08;如markdown、json&#xff09;&#xff0c;可以很方便地抽取為任意格式。 MinerU誕生于書生-浦語的預訓練過程中&#xff0c;我們將會集中精力解決科技文獻中的符號轉化問…

代碼隨想錄算法訓練營第三十九天|62.不同路徑 63.不同路徑ll

62.不同路徑&#xff1a; 文檔講解&#xff1a;代碼隨想錄|62.不同路徑 視頻講解&#xff1a;https://www.bilibili.com/video/BV1ve4y1x7Eu 狀態&#xff1a;已做出 一、題目要求&#xff1a; 一個二維數組里&#xff0c;將(0&#xff0c;0)位置下標作為起點&#xff0c;計算…

openEuler2403安裝部署Prometheus和Grafana

文章目錄openEuler2403安裝部署Prometheus和Grafana一、前言1.簡介2.環境二、正文1.環境準備1&#xff09;JDK 安裝部署&#xff08;可選&#xff09;2&#xff09;關閉防火墻2.安裝 Prometheus1&#xff09;下載和安裝2&#xff09;啟動3&#xff09;systemd服務管理3.安裝 Gr…

樂吾樂大屏可視化組態軟件【SQL數據源】

樂吾樂大屏可視化組態軟件&#xff08;大屏可視化設計器 - 樂吾樂Le5le&#xff09;支持直接對接SQL數據源功能&#xff0c;目前僅對企業源碼客戶開放。 配置SQL數據源 管理員進入可視化管理中心&#xff0c;點擊SQL數據源&#xff0c;配置添加SQL數據源。 創建SQL數據源連接 …

Django高效查詢:values_list實戰詳解

Django 實戰案例 講解 values_list 的用法。 values_list("field", flatTrue) → 獲取單字段的一維列表。values_list("f1", "f2") → 獲取多個字段&#xff0c;返回元組。搭配 filter / distinct / in / 外鍵查詢 非常高效。適合用于 導出數據 …

Java數據結構——樹

一、樹型結構1.1 概念我們之前提到的數組&#xff0c;單鏈表&#xff0c;棧和隊列都是一種線性結構&#xff0c;每個元素都有最多一個后繼節點。而樹型結構是一種非線性結構&#xff0c;它是由n&#xff08;n>0&#xff09;節點組成的一個具有層次關系的集合。它之所以叫做樹…

基于LLM的月全食時空建模與智能預測:從天文現象到深度學習融合

當古老的天文學遇上現代人工智能,會碰撞出怎樣的火花? 一、當月球遇見AI 月全食,這一令人驚嘆的天文現象,自古以來就吸引著無數天文學家和愛好者的目光。當地球恰好運行到太陽和月球之間,完全遮擋太陽光時,我們就能目睹月球逐漸被"吞噬"然后又重煥光彩的奇妙…

LeetCode熱題 42.接雨水

題目 思路&#xff1a; 通過畫圖觀察我們其實可以很容易發現&#xff0c;每個柱子接多少水由這個地方左邊最高的柱子和右邊最高的柱子確定&#xff0c;因為總要形成一個坑嘛&#xff0c;然后就能接著確定&#xff1a; 當前柱子接水量 min(左邊最高柱子的高度, 右邊最高柱子的…

PostgreSQL與Greenplum數據庫的編程語言連接

編程語言連接數據庫 目前數據庫一般支持HA的連接&#xff0c;即一個Coordinator內的一個節點異常后會鏈接到另外的一個節點&#xff0c;不會影響業務的正常運行。在JDBC配置時需要采用 高可用鏈接字符串(Connection URL/DSN) 的方式連接。適用于不同的編程語言中使用&#xff…

后端(JDBC)學習筆記(CLASS 1):基礎篇(一)

一、引言1、數據的存儲開發java程序的時候&#xff0c;數據都是存儲在內存中&#xff0c;屬于臨時存儲&#xff0c;當程序停止或重啟時&#xff0c;內存中的數據就丟失了。為了解決數據的長期存儲問題&#xff0c;有如下解決方案&#xff1a;1、數據通過I/O流技術&#xff0c;存…

卷對卷(Roll-to-Roll,R2R)技術的應用領域和技術進展

目錄&#xff1a;第一節&#xff1a;卷對卷技術及其應用領域和工藝要求一、卷對卷技術發展現概述二、卷對卷研發和規模化應用難點重點和發展趨勢三、卷對卷工藝主要應用領域及工藝要求第二節&#xff1a;卷對卷生產工藝參數及質量控制四、卷對卷生產工藝控制參數和條件五、卷對…

【Ansible】管理變量和事實知識點

1.Ansible變量名由什么組成&#xff1f;答&#xff1a;變量名必須以字母開頭&#xff0c;且只能含有字母、數字和下劃線。2.定義變量的方法及變量的優先級&#xff1f;答&#xff1a;按優先級從低到高排列: 在清單中定義的組變量 < 在清單或playbook所在目錄的group_vars子目…