中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

掌握分布式事務鎖,這個大廠實戰訂單鎖你一定要會

發布時間:2020-08-02 11:15:25 來源:網絡 閱讀:306 作者:愛碼仕i 欄目:編程語言

掌握分布式事務鎖,這個大廠實戰訂單鎖你一定要會

分布式趨勢

掌握分布式事務鎖,這個大廠實戰訂單鎖你一定要會

目前幾乎很多大型網站及應用都是分布式部署的,分布式場景中我們也都會遇到一個非常重要的問題:數據一致性。正如分布式的CAP理論說的一樣:“任何一個分布式系統都無法同時滿足一致性(Consistency)、可用性(Availability)和分區容錯性(Partition tolerance),最多只能同時滿足兩項。”所以,很多系統在設計之初就要對這三者進行取舍。在互聯網領域的絕大多數的場景中,都需要犧牲強一致性來換取系統的高可用性,系統往往只需要保證“最終一致性”,只要這個最終時間是在用戶可以接受的范圍內即可。

在很多場景中,我們為了保證數據的最終一致性,需要很多的技術方案來支撐,比如分布式事務、分布式鎖、定時任務調度等。盡管Java提供了很多并發處理API,但這些API在分布式場景中就顯得無能為力了。

所以針對分布式鎖的實現我們需要借助別的工具,目前比較常用的有以下幾種方案:

  1. 基于數據庫實現分布式鎖
  2. 基于緩存(redis,memcached,tair)實現分布式鎖
  3. 基于Zookeeper實現分布式鎖

本篇發文我們主要說下基于Redis的分布式鎖實戰。

實際編寫代碼之前,我們說下首要條件

分布式鎖可用的四個條件:

  1. 互斥性。在任意時刻,只有一個客戶端能持有鎖。
  2. 不會發生死鎖。即使有一個客戶端在持有鎖的期間崩潰而沒有主動解鎖,也能保證后續其他客戶端能加鎖。
  3. 具有容錯性。只要大部分的Redis節點正常運行,客戶端就可以加鎖和解鎖。
  4. 解鈴還須系鈴人。加鎖和解鎖必須是同一個客戶端,客戶端自己不能把別人加的鎖給解了。

分布式鎖實戰步驟:

編寫ILock接口

掌握分布式事務鎖,這個大廠實戰訂單鎖你一定要會

編寫ILock接口實現

掌握分布式事務鎖,這個大廠實戰訂單鎖你一定要會

掌握分布式事務鎖,這個大廠實戰訂單鎖你一定要會

掌握分布式事務鎖,這個大廠實戰訂單鎖你一定要會

LockGetter抽象類

掌握分布式事務鎖,這個大廠實戰訂單鎖你一定要會

掌握分布式事務鎖,這個大廠實戰訂單鎖你一定要會

從圖示我們可以看出,通過LockGetter抽象類進行具體的加鎖成功或則失敗的具體業務走向。這一個思想同學們要謹記于心。能夠熟練應用的話,他會使你在編程之路上走的更加順暢。

此外,可以看到,我們實際加鎖就一行代碼:jedis.set(fieldKey, value, "NX", "EX", seconds);,這個set()方法一共有五個形參:

第一個參數為key,我們使用key來當鎖,因為key是唯一的。

第二個參數為value,我們傳的是requestId,很多童鞋可能不明白,有key作為鎖不就夠了嗎,為什么還要用到value?原因就是我們在上面講到可靠性時,分布式鎖要滿足第四個條件解鈴還須系鈴人,通過給value賦值為requestId,我們就知道這把鎖是哪個請求加的了,在解鎖的時候就可以有依據。requestId可以使用UUID.randomUUID().toString()方法生成。

第三個參數為nxxx,這個參數我們填的是NX,意思是SET IF NOT EXIST,即當key不存在時,我們進行set操作;若key已經存在,則不做任何操作;

第四個參數為expx,這個參數我們傳的是PX,意思是我們要給這個key加一個過期的設置,具體時間由第五個參數決定。

第五個參數為time,與第四個參數相呼應,代表key的過期時間。

總的來說,執行上面的set()方法之后會出現兩種情況:

  1. 當前沒有鎖(key不存在),那么就進行加鎖操作,并對鎖設置個有效期,同時value表示加鎖的客戶端。
  2. 鎖已經存在,redis不做任何操作。

總結:

使用緩存來實現分布式鎖優點:

  1. 可以提供更好的性能,同時很多緩存服務都是集群部署的,可以避免單點問題。
  2. 很多緩存服務都提供了可以用來實現分布式鎖的方法,比如redis的setnx方法等。
  3. 緩存服務也都提供了對數據的過期自動刪除的支持,可以直接設置超時時間來控制鎖的釋放。

使用緩存實現分布式鎖盡管性能好,實現起來較為方便。但也不是沒有缺點,有時候我們的程序內部出現異常后可能會發生死鎖,這就需要開發時候注意代碼編寫,后續測試人員測試時候測試案例要盡可能覆蓋。

掌握分布式事務鎖,這個大廠實戰訂單鎖你一定要會

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

昭苏县| 景泰县| 通许县| 吴忠市| 麻阳| 江华| 长治市| 宜丰县| 牙克石市| 丰顺县| 万全县| 临泉县| 德庆县| 右玉县| 韶山市| 皮山县| 颍上县| 石门县| 利辛县| 任丘市| 博兴县| 兰坪| 静安区| 神池县| 正蓝旗| 涟源市| 临城县| 德惠市| 美姑县| 小金县| 隆德县| 锦州市| 茌平县| 阿拉善左旗| 河间市| 湘乡市| 和林格尔县| 新密市| 五莲县| 曲周县| 留坝县|