溫馨提示×

溫馨提示×

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

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

如何實現(xiàn)分布式鎖

發(fā)布時間:2020-08-03 14:18:04 來源:億速云 閱讀:154 作者:小豬 欄目:數(shù)據(jù)庫

這篇文章主要講解了如何實現(xiàn)分布式鎖,內(nèi)容清晰明了,對此有興趣的小伙伴可以學(xué)習(xí)一下,相信大家閱讀完之后會有幫助。

分布式鎖三種實現(xiàn)方式:

1. 基于數(shù)據(jù)庫實現(xiàn)分布式鎖;

2. 基于緩存(Redis等)實現(xiàn)分布式鎖;

3. 基于Zookeeper實現(xiàn)分布式鎖;

一, 基于數(shù)據(jù)庫實現(xiàn)分布式鎖

1. 悲觀鎖

利用select … where … for update 排他鎖

注意: 其他附加功能與實現(xiàn)一基本一致,這里需要注意的是“where name=lock ”,name字段必須要走索引,否則會鎖表。有些情況下,比如表不大,mysql優(yōu)化器會不走這個索引,導(dǎo)致鎖表問題。

2. 樂觀鎖

所謂樂觀鎖與前邊最大區(qū)別在于基于CAS思想,是不具有互斥性,不會產(chǎn)生鎖等待而消耗資源,操作過程中認為不存在并發(fā)沖突,只有update version失敗后才能覺察到。我們的搶購、秒殺就是用了這種實現(xiàn)以防止超賣。

通過增加遞增的版本號字段實現(xiàn)樂觀鎖

如何實現(xiàn)分布式鎖如何實現(xiàn)分布式鎖

二, 基于緩存(Redis等)實現(xiàn)分布式鎖

1. 使用命令介紹:

(1)SETNX

SETNX key val:當(dāng)且僅當(dāng)key不存在時,set一個key為val的字符串,返回1;若key存在,則什么都不做,返回0。

(2)expire

expire key timeout:為key設(shè)置一個超時時間,單位為second,超過這個時間鎖會自動釋放,避免死鎖。

(3)delete

delete key:刪除key

在使用Redis實現(xiàn)分布式鎖的時候,主要就會使用到這三個命令。

2. 實現(xiàn)思想:

(1)獲取鎖的時候,使用setnx加鎖,并使用expire命令為鎖添加一個超時時間,超過該時間則自動釋放鎖,鎖的value值為一個隨機生成的UUID,通過此在釋放鎖的時候進行判斷。

(2)獲取鎖的時候還設(shè)置一個獲取的超時時間,若超過這個時間則放棄獲取鎖。

(3)釋放鎖的時候,通過UUID判斷是不是該鎖,若是該鎖,則執(zhí)行delete進行鎖釋放。

三, 基于Zookeeper實現(xiàn)分布式鎖

ZooKeeper是一個為分布式應(yīng)用提供一致性服務(wù)的開源組件,它內(nèi)部是一個分層的文件系統(tǒng)目錄樹結(jié)構(gòu),規(guī)定同一個目錄下只能有一個唯一文件名?;赯ooKeeper實現(xiàn)分布式鎖的步驟如下:

(1)創(chuàng)建一個目錄mylock;
(2)線程A想獲取鎖就在mylock目錄下創(chuàng)建臨時順序節(jié)點;
(3)獲取mylock目錄下所有的子節(jié)點,然后獲取比自己小的兄弟節(jié)點,如果不存在,則說明當(dāng)前線程順序號最小,獲得鎖;
(4)線程B獲取所有節(jié)點,判斷自己不是最小節(jié)點,設(shè)置監(jiān)聽比自己次小的節(jié)點;
(5)線程A處理完,刪除自己的節(jié)點,線程B監(jiān)聽到變更事件,判斷自己是不是最小的節(jié)點,如果是則獲得鎖。

這里推薦一個Apache的開源庫Curator,它是一個ZooKeeper客戶端,Curator提供的InterProcessMutex是分布式鎖的實現(xiàn),acquire方法用于獲取鎖,release方法用于釋放鎖。

優(yōu)點:具備高可用、可重入、阻塞鎖特性,可解決失效死鎖問題。

缺點:因為需要頻繁的創(chuàng)建和刪除節(jié)點,性能上不如Redis方式。

四,對比

數(shù)據(jù)庫分布式鎖實現(xiàn)

缺點:

1.db操作性能較差,并且有鎖表的風(fēng)險

2.非阻塞操作失敗后,需要輪詢,占用cpu資源;

3.長時間不commit或者長時間輪詢,可能會占用較多連接資源

Redis(緩存)分布式鎖實現(xiàn)

缺點:

1.鎖刪除失敗 過期時間不好控制

2.非阻塞,操作失敗后,需要輪詢,占用cpu資源;

ZK分布式鎖實現(xiàn)

缺點:性能不如redis實現(xiàn),主要原因是寫操作(獲取鎖釋放鎖)都需要在Leader上執(zhí)行,然后同步到follower。

總之:ZooKeeper有較好的性能和可靠性。

從理解的難易程度角度(從低到高)數(shù)據(jù)庫 > 緩存 > Zookeeper

從實現(xiàn)的復(fù)雜性角度(從低到高)Zookeeper >= 緩存 > 數(shù)據(jù)庫

從性能角度(從高到低)緩存 > Zookeeper >= 數(shù)據(jù)庫

從可靠性角度(從高到低)Zookeeper > 緩存 > 數(shù)據(jù)庫

看完上述內(nèi)容,是不是對如何實現(xiàn)分布式鎖有進一步的了解,如果還想學(xué)習(xí)更多內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI