久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

Redis常見分布鎖的原理是什么和怎么實現

143次閱讀
沒有評論

共計 2180 個字符,預計需要花費 6 分鐘才能閱讀完成。

今天丸趣 TV 小編給大家分享一下 Redis 常見分布鎖的原理是什么和怎么實現的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

常見的分布式鎖的實現如下圖:

基于數據庫悲觀鎖

悲觀鎖(Pessimistic Lock)顧名思義為很悲觀的鎖,每次在拿數據的時候都會上鎖。這樣別人想拿數據就被擋住,直到悲觀鎖被釋放,悲觀鎖中的共享資源每次只給一個線程使用,其它線程阻塞,用完后再把資源轉讓給其它線程,但是在效率方面,處理加鎖的機制會產生額外的開銷,且容易產生死鎖。

實現原理

悲觀并發控制實際上是 先取鎖再訪問 的保守策略,為數據處理的安全提供了保證.

具體實現

例如通過悲觀鎖來實現庫存扣減的偽代碼如下:

//  對于庫存記錄進行行鎖
SELECT *FROM sys_goods s WHERE s.Id= 1  FOR UPDATE;
// 執行庫存扣減
update sys_stock s set s.stockQty=s.stockQty-#{number} where s.goodId=1 and s.stockQty 0;// 提交事務, 自動釋放悲觀鎖。

樂觀鎖簡介

樂觀鎖是基于數據版本號 (version) 的機制來實現的。數據庫表添加 version 字段, 讀取出數據時,將此版本號讀出,在更新過程中,會對版本號進行比較,如果是一致的,則會成功執行本次操作, 且版本號加 1,如果版本號不一致,則會更新失敗。

實現原理

相對悲觀鎖,樂觀鎖的實現不會使用到數據庫的鎖機制,樂觀鎖的原理使用的 CAS 的機制來實現的,CAS(Compare-and-Swap)即比較并替換.

1、比較:讀取到了一個值 A,在將其更新為 B 之前,檢查原值是否仍為 A(未被其他線程改動).

2、設置:如果是未發送變化,則將 A 更新為 B 結束。如果發生變化,則什么都不做。

具體實現

例如樂觀鎖來實現庫存扣減的偽代碼如下:

//  查詢庫存記錄,獲取版本號
SELECT stockQty,version FROM sys_goods s WHERE s.Id= 1 
// 執行庫存扣減,防止出現超賣
update sys_stock s set 
 s.stockQty=s.stockQty-#{number},
 s.version=version+1
 where s.goodId=1 and s.stockQty 0 and version=#{version};

Redis 實現分布式鎖

關于 Redis 分布式鎖的實現,已經在前期的文章中進行了講解,大家可以參考如下文章

Spring Boot 實現 Redis 分布式鎖原理

Spring Boot 集成 Redisson 實現分布式鎖詳細案例

Zooker 實現分布式鎖

Zookper 實現分布式鎖,主要是應用 zookeeper 節點的臨時和有序性來實現。

加鎖過程

當客戶端 1 請求時,Zookeeper 客戶端會創建一個持久節點 Locks 節點,如果客戶端 1 想獲取鎖, 會在 locks 節點下創建臨時節點 /node_000000,如果查找 Locks 下面所有臨時有序子節點,當自己為最小的節點是則獲取鎖成功。

當客戶端 2 嘗試獲取鎖時,也會查看 locks 下面的臨時節點,判斷自己的節點 /node_000001 是不是最小,如果不是最小則獲取鎖失敗,客戶端 2 會向它排序靠前的節點 node_000000 注冊 watch 事件,用來監聽 node_000000 是否存在,雖然搶鎖失敗,但是 node_000001 進入等待狀態。

釋放鎖的過程

Zookeeper 的客戶端業務完成或者客戶端發生故障,都會刪除臨時節點并且釋放鎖。如果是任務完成,客戶端 1 還會顯式調用刪除 node_000000 的指令。

例如上述圖,客戶端 1 斷開,臨時節點 node_000000 已被刪除,而此時 node_000001 通過 watcher 監聽發現自己為為最小的臨時節點,所以獲取鎖成功。

異常場景分析

客戶端 1 創建臨時節點后,會與 Zookeeper 服務器維護一個 Session,這個 Session 會依賴客戶端 定時心跳來維持連接。由于網路異常原因,Zookeeper 長時間收不到客戶端 1 的心跳,就認為這個 Session 過期了,也會把這個臨時節點刪除,此時客戶端 2 創建臨時節點能夠獲取鎖成功。當客戶端網絡恢復正常后,它仍然認為持有鎖,此時就會造成鎖沖突。

具體實現

Zookeeper 實現分布式鎖,可以采用 Curator 實現分布式鎖,關于 SpringBoot 如何集成 Curator,大家可以參考如下文章:

Java Spring Boot 集成 Zookeeper

Zookpeer 實現分布式鎖實現庫存扣減

 @RequestMapping(/lockStock)
 public void lockStock()
 { zooKeeperUtil.lock( /Locks , 1000, TimeUnit.SECONDS, ()- {
 // 業務邏輯
 });
 }

小結:

關于分布式鎖的實現的對比,詳情請查看下圖:

以上就是“Redis 常見分布鎖的原理是什么和怎么實現”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,丸趣 TV 小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注丸趣 TV 行業資訊頻道。

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-13發表,共計2180字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 泌阳县| 平山县| 临武县| 台安县| 冷水江市| 泸水县| 东乡| 益阳市| 当阳市| 宜昌市| 乌鲁木齐县| 罗源县| 林甸县| 龙州县| 土默特左旗| 南漳县| 平武县| 贡山| 巴彦县| 石渠县| 辛集市| 衢州市| 旌德县| 浮梁县| 闽清县| 芜湖市| 台安县| 伊宁市| 葵青区| 泸定县| 荆州市| 临安市| 和林格尔县| 呼和浩特市| 万荣县| 江口县| 安庆市| 黎平县| 诏安县| 昆明市| 买车|