redis分布式鎖的學習記錄

核心性質

獨占性:對于同一把鎖,同一時刻只能被一個加鎖方獨占
健壯性:不能產生死鎖。如果有一個因為宕機無法主動解鎖,鎖也應該被正常加載
對稱性:加成和解鎖的使用方必須為同一個身份,不允許被非方釋放
高可用:當提供分布式鎖服務的基礎組件中存在少量節點發生故障時,不應該影響到分布式鎖服務的穩定性

實現類型

對 cpu 空轉以及阻塞協程兩種行為的損耗做出權衡

主動輪詢型:該模型類似于單機鎖中的主動輪詢 + cas 樂觀鎖模型,取鎖方會持續對分布式鎖發出嘗試獲取動作,如果鎖已被占用則會不斷發起重試,直到取鎖成功為止
watch 回調型:在取鎖方發現鎖已被他人占用時,會創建 watcher 監視器訂閱鎖的釋放事件,隨后不再發起主動取鎖的嘗試;當鎖被釋放后,取鎖方能通過之前創建的 watcher 感知到這一變化,然后再重新發起取鎖的嘗試動作

分布式場景中”輪詢“,背后存在的行為可能是一次甚至多次網絡 IO 請求.但是,watch 機制在實現過程中需要建立長連接完成 watch 監聽動作,也會存在一定的資源損耗

主動輪詢型

針對同一把分布式鎖,用同一條數據標識(redis中的string同一個key對應的value)
假如在插入之前不存在數據,插入成功,則被認定為加鎖
把從存儲介質中刪除類比成解鎖動作
假如在插入之前存在,則持續輪訓,直到數據被刪除,并有自己插入成功
由于是并發場景,需要保證【 (1)檢查數據是否已被插入(2)數據不存在則插入數據 】這兩個步驟之間是原子化不可拆分的(在 redis 中是 set only if not exist —— SETNX 操作)

死鎖問題

使用 redis 時,通過過期時間 expire time自動刪除.
過期機制問題:鎖的持有者并不能精確預判到自己持鎖后處理業務邏輯的實際耗時,假如因為一些異常情況導致占有鎖的使用方在業務處理流程中的耗時超過了設置的過期時間閾值,就會導致鎖被提前釋放,其他取鎖方可能取鎖成功,最終引起數據不一致的并發問題.
解決方案:在鎖的持有方未完成業務邏輯的處理時,會持續對分布式鎖的過期閾值進行延期操作.

弱一致性問題

redis是ap形式,為保證服務的吞吐性,主從節點之間的數據同步是異步延遲進行。
問題 :倘若 使用方 A 在 redis master 節點加鎖成功,但是對應的 kv 記錄在同步到 slave 之前,master 節點就宕機了. 此時未同步到這項數據的 slave 節點升為 master,這樣分布式鎖被 A 持有的“憑證” 就這樣憑空消失了. 于是不知情的使用方 B C D 都可能加鎖成功,于是就出現了一把鎖被多方同時持有的問題,導致分布式鎖最基本的獨占性遭到破壞.

watch 回調型

差別在于

倘若在插入數據時,發現該條記錄已經存在,說明鎖已被他人持有,此時選擇監聽這條數據記錄的刪除事件,當對應事件發生時說明鎖被釋放了,此時才繼續嘗試取鎖

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

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

相關文章

HCIA-實驗命令基礎學習:

視頻學習: 第一部分:基礎學習。 19——子網掩碼。 27——防火墻配置: 32——企業級路由器配置: 基礎實驗完成:(完成以下目錄對應的實驗,第一部分基礎實驗就完成。) 方法&#xff…

C //習題 8.13 寫一個用矩形法求定積分的通用函數,分別求

C程序設計 (第四版) 譚浩強 習題8.13 習題 8.13 寫一個用矩形法求定積分的通用函數,分別求 ∫ 0 1 s i n x d x , ∫ 0 1 c o s x d x , ∫ 0 1 e x d x \int_{0}^{1}sinx\ dx,\ \ \int_{0}^{1}cosx\ …

ILI9225 TFT顯示屏16位并口方式驅動

所用屏及資料如后圖: ILI9225,176*220,8位或16位并口屏,IM0接GND,電源及背光接3.3v 主控:CH32V307驅動(庫文件和STM32基本一樣) 一、源碼 ILI9225.c #include "ILI9225.h&quo…

設計模式(二)-創建者模式(4)-原型模式

一、為何需要原型模式(Prototype Pattern)? 在軟件設計中,我們會遇到到這樣的情況:對原對象進行拷貝一個新的副本。想要實現這樣的邏輯,有一種笨方法就是對原對象里的所有變量進行逐一賦值。但是這樣的做法會導致代碼…

【SpringCloud】認識微服務、服務拆分以及遠程調用

SpringCloud 1.認識微服務 1.1單體架構 單體架構:將業務的所有功能集中在一個項目中開發,打成一個包部署 單體架構的優缺點: **優點:**架構簡單,部署成本低 **缺點:**耦合度高(維護困難&…

【C++】郭老二博文之:C++目錄

1、POCO 【POCO】POCO學習總結(一)–下載與編譯 【POCO】POCO學習總結(二)——配置選擇 【POCO】POCO學習總結(三)——交叉編譯 2、C11 2.1 STL算法 【C】C11 STL算法(一):非修改序列操作&a…

筆記59:序列到序列學習Seq2seq

本地筆記地址:D:\work_file\(4)DeepLearning_Learning\03_個人筆記\3.循環神經網絡\第9章:動手學深度學習~現代循環神經網絡 a a a a a a a a a a a a a a a

C++ Day04 this指針,友元函數,重載

this指針 概念 誰調用 this 所在的函數 ,this 就存儲誰的地址 特點 1, 在當前類的非靜態成員函數中調用本類非靜態成員時 , 默認有 this 關鍵字 2, 靜態成員函數 , 沒有 this 指針。 示例 #include <iostream> #include <cstring> using namespace std; class S…

前后端分離項目跨域請求的問題與解決辦法

目錄 一、為什么會存在跨域請求&#xff1f; 二、跨域請求的流程&#xff1f; 三、什么情況下會觸發CROS機制&#xff1f; 四、如何解決跨域請求導致的問題&#xff1f; 一、為什么會存在跨域請求&#xff1f; 跨域請求是因為瀏覽器的同源策略引起的。同源策略是瀏覽器的一種…

算法刷題-動態規劃2

算法刷題-動態規劃2 珠寶的最高價值下降路徑最小和 珠寶的最高價值 題目 大佬思路 多開一行使得代碼更加的簡潔 移動到右側和下側 dp[ i ][ j ]有兩種情況&#xff1a; 第一種是從上面來的禮物最大價值&#xff1a;dp[ i ][ j ] dp[ i - 1 ][ j ] g[ i ][ j ] 第二種是從左…

10.10-11 科研記錄 一些多模態工作的相關思考

論文出發點很簡單&#xff0c;第一&#xff0c;就是想要去除文本的冗余數據&#xff0c;有多篇文章也提到了&#xff0c;冗余文本影響對下游任務的性能&#xff0c;大量無關的文本輸入到大模型也會影響大模型的性能&#xff0c;本質也很好理解&#xff0c;就是盡可能去除與任務…

握住音樂的法寶 - 簡譜

簡譜是音樂學習中至關重要的記譜法。除了簡譜&#xff0c;還有吉他和鋼琴的五線譜&#xff0c;以及我最喜歡的古琴減字譜等其他記譜方式。如果你對音樂感興趣&#xff0c;一起學習吧&#xff0c;我不允許你是一個文盲。 一、調拍號 “1C 4/4”即為調拍號&#xff0c;調拍號分…

opencv-直方圖均衡化

直方圖均衡化是一種用于增強圖像對比度的圖像處理技術。它通過調整圖像的灰度級別分布&#xff0c;使得圖像中各個灰度級別的像素分布更均勻&#xff0c;從而提高圖像的對比度。 在OpenCV中&#xff0c;你可以使用cv2.equalizeHist()函數來進行直方圖均衡化。 以下是一個簡單…

opencv-2D直方圖

cv2.calcHist() 是 OpenCV 中用于計算直方圖的函數。它可以計算一維或多維直方圖&#xff0c;用于分析圖像中像素值的分布。 基本的語法如下&#xff1a; hist cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])參數說明&#xff1a; images:…

[點云分割] 條件歐氏聚類分割

介紹 條件歐氏聚類分割是一種基于歐氏距離和條件限制的點云分割方法。它通過計算點云中點與點之間的歐氏距離&#xff0c;并結合一定的條件限制來將點云分割成不同的區域或聚類。 在條件歐氏聚類分割中&#xff0c;通常會定義以下兩個條件來判斷兩個點是否屬于同一個聚類&…

Java繼承中的屬性名相同但是類型不同的情況

如果子類出現一個屬性與父類的屬性名一樣,那么父類的屬性將會被隱藏(java官方文檔) 在繼承當中,子類繼承父類的屬性和繼承方法的方式上有所差別: 父類屬性不可被重寫,只會被調用,父類方法可以被重寫,也可以被調用 當子類中存在和父類同名屬性,父類屬性會隱藏起來,在多態的情…

利用Python進行數據分析【送書第六期:文末送書】

&#x1f468;?&#x1f393;博主簡介 &#x1f3c5;云計算領域優質創作者 ??&#x1f3c5;華為云開發者社區專家博主 ??&#x1f3c5;阿里云開發者社區專家博主 &#x1f48a;交流社區&#xff1a;運維交流社區 歡迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…

vue實現愛心形狀的復選框

目錄 HTML代碼&#xff1a; CSS代碼&#xff1a; Vue代碼&#xff1a; 這個例子使用了CSS來創建一個愛心形狀的復選框&#xff0c;并使用Vue來控制其選中狀態。點擊復選框時&#xff0c;將調用toggleChecked方法來切換checked屬性的值&#xff0c;以控制復選框的狀態。 以下…

7.vue3項目(七):品牌管理頁面的增刪改查

目錄 1.靜態頁面 2.查詢功能實現 (1)設置出參入參類型 (2)編寫查詢接口