特邀導(dǎo)師:波波
前線下知名機(jī)構(gòu)教學(xué)總監(jiān)综看、CSDN博客專家品腹,曾就職于用友軟件電力事業(yè)部。參與項(xiàng)目:中國(guó)華電PMIS項(xiàng)目红碑、中國(guó)華電集團(tuán)ERP系統(tǒng)舞吭、中國(guó)國(guó)電PMIS項(xiàng)目等
分布式鎖經(jīng)常出現(xiàn)在面試的過(guò)程中,通常面試官會(huì)從服務(wù)框架(Spring Cloud析珊、Dubbo)聊起羡鸥,一路聊到分布式事務(wù)、分布式鎖忠寻、ZooKeeper等知識(shí)惧浴。所以這篇文章以面試的角度帶你了解分布式鎖這塊知識(shí)。
01分布式鎖的解決方案有哪些
分布式鎖奕剃,顧名思義是分布式環(huán)境下使用的鎖衷旅,重點(diǎn)是鎖。它的作用是保護(hù)數(shù)據(jù)安全纵朋。
分布式鎖
隨著互聯(lián)網(wǎng)技術(shù)的不斷發(fā)展芜茵,數(shù)據(jù)量的不斷增加,業(yè)務(wù)邏輯日趨復(fù)雜倡蝙,在這種背景下,傳統(tǒng)的集中式系統(tǒng)已經(jīng)無(wú)法滿足我們的業(yè)務(wù)需求绞佩,分布式系統(tǒng)被應(yīng)用在更多的場(chǎng)景寺鸥,而在分布式系統(tǒng)中訪問(wèn)共享資源就需要一種互斥機(jī)制,來(lái)防止彼此之間的互相干擾品山,以保證一致性胆建,在這種情況下,我們就需要用到分布式鎖肘交。分布式鎖的解決方案有MySQL笆载、Redis、Zookeeper等等。
MYSQL
MYSQL通過(guò)方式如下:
01利用mysql唯一索引
數(shù)據(jù)庫(kù)中的每一條記錄就是一把鎖凉驻,利用的MySQL唯一索引的排他性腻要。如果有多個(gè)請(qǐng)求同時(shí)提交到數(shù)據(jù)庫(kù)的話,數(shù)據(jù)庫(kù)會(huì)保證只有一個(gè)操作可以成功涝登,那么我們就可以認(rèn)為操作成功的那個(gè)線程獲得了該方法的鎖雄家,當(dāng)方法執(zhí)行完畢之后,想要釋放鎖的話胀滚,刪除這條數(shù)據(jù)庫(kù)記錄即可趟济。
利用mysql唯一索引圖
02悲觀鎖 /行鎖
悲觀鎖是使用lock方法,利用for update?加顯式的行鎖咽笼,這樣就能利用這個(gè)行級(jí)的排他鎖來(lái)實(shí)現(xiàn)分布式鎖了顷编,同時(shí)unlock的時(shí)候只要釋放commit這個(gè)事務(wù),就能達(dá)到釋放鎖的目的剑刑。
悲觀鎖圖
03樂(lè)觀鎖version
樂(lè)觀鎖比悲觀鎖的性能高媳纬,樂(lè)觀鎖并不是鎖,只是一種設(shè)計(jì)思想叛甫。它的實(shí)現(xiàn)方式是使用數(shù)據(jù)版本(Version)記錄機(jī)制层宫。
樂(lè)觀鎖
Redis
選用Redis實(shí)現(xiàn)分布式鎖原因有
(1)Redis有很高的性能;
(2)Redis命令對(duì)此支持較好其监,實(shí)現(xiàn)起來(lái)比較方便萌腿。
Redis使用場(chǎng)景是在并發(fā)量特別高的情況下。
Zookeeper
Zookeeper是分布式協(xié)調(diào)框架抖苦,常見(jiàn)組件出現(xiàn)問(wèn)題去協(xié)調(diào)毁菱。Zookeeper使用的場(chǎng)景有注冊(cè)中心、配置中心锌历、動(dòng)態(tài)上下線感知贮庞、分布式鎖等等。
Zookeeper的集群機(jī)制是重點(diǎn)考核內(nèi)容究西。它是半數(shù)存活機(jī)制窗慎,整個(gè)集群節(jié)點(diǎn)中有半數(shù)以上的節(jié)點(diǎn)存活。
集群節(jié)點(diǎn)的角色
分為L(zhǎng)eader和follower兩類卤材。
Leader是集群工作的核心遮斥。主要工作是所有數(shù)據(jù)的讀寫操作。
follower是集群的跟隨者扇丛∈趼穑可以存儲(chǔ)數(shù)據(jù),每一個(gè)節(jié)點(diǎn)可以存數(shù)據(jù)帆精。主要工作是所有數(shù)據(jù)的讀取操作较屿。
短暫節(jié)點(diǎn)是Zookeeper的節(jié)點(diǎn)其中的一個(gè)類型隧魄,它帶有-e屬性。它的效果是誰(shuí)創(chuàng)建的節(jié)點(diǎn)隘蝎,大家都可以看到购啄,且這個(gè)節(jié)點(diǎn)的創(chuàng)建者下線后節(jié)點(diǎn)會(huì)消失。特性有:有序末贾、短暫闸溃、事件監(jiān)聽(tīng)機(jī)制。
02Zookeeper怎么實(shí)現(xiàn)分布式鎖
Zookeeper分布式鎖原理
約定:序號(hào)最小的獲取鎖拱撵;
序號(hào)不是最小就監(jiān)聽(tīng)序號(hào)比他小的前一個(gè)節(jié)點(diǎn)辉川;
如果節(jié)點(diǎn)被喚醒,判斷喚醒的節(jié)點(diǎn)是否是序號(hào)最小的節(jié)點(diǎn)拴测。如果是最小的獲取鎖乓旗;如果不是最小的,那么就監(jiān)聽(tīng)比他小的節(jié)點(diǎn)
zookeeper分布式鎖原理圖
03Redis如何實(shí)現(xiàn)分布式
Redis分布式鎖實(shí)現(xiàn)思想
(1)獲取鎖的時(shí)候集索,使用setnx加鎖屿愚,并使用expire命令為鎖添加一個(gè)超時(shí)時(shí)間,超過(guò)該時(shí)間則自動(dòng)釋放鎖务荆,鎖的value值為一個(gè)隨機(jī)生成的UUID妆距,通過(guò)此在釋放鎖的時(shí)候進(jìn)行判斷;
(2)獲取鎖的時(shí)候還設(shè)置一個(gè)
獲取的超時(shí)時(shí)間函匕,若超過(guò)這個(gè)時(shí)間則放棄獲取鎖娱据;
(3)釋放鎖的時(shí)候,通過(guò)UUID判斷是不是該鎖盅惜,若是該鎖中剩,則執(zhí)行delete進(jìn)行鎖釋放。
Redis分布式鎖演示圖
分布式鎖在日常Coding中經(jīng)常使用抒寂,但分布式鎖這方面知識(shí)依然很深?yuàn)W结啼。希望這篇文章能讓你清楚分布式鎖的解決方案,進(jìn)一步提升查看源碼的能力屈芜。