小編給大家分享一下redis分布式鎖的實現(xiàn)原理,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!
分布式鎖其實可以理解為:控制分布式系統(tǒng)有序的去對共享資源進行操作,通過互斥來保持一致性。
舉個不太恰當(dāng)?shù)睦樱?/strong>
假設(shè)共享的資源就是一個房子,里面有各種書,分布式系統(tǒng)就是要進屋看書的人,分布式鎖就是保證這個房子只有一個門并且一次只有一個人可以進,而且門只有一把鑰匙。然后許多人要去看書,可以,排隊,第一個人拿著鑰匙把門打開進屋看書并且把門鎖上,然后第二個人沒有鑰匙,那就等著,等第一個出來,然后你在拿著鑰匙進去,然后就是以此類推
實現(xiàn)原理
互斥性
保證同一時間只有一個客戶端可以拿到鎖,也就是可以對共享資源進行操作
安全性
只有加鎖的服務(wù)才能有解鎖權(quán)限,也就是不能讓a加的鎖,bcd都可以解鎖,如果都能解鎖那分布式鎖就沒啥意義了
可能出現(xiàn)的情況就是a去查詢發(fā)現(xiàn)持有鎖,就在準(zhǔn)備解鎖,這時候忽然a持有的鎖過期了,然后b去獲得鎖,因為a鎖過期,b拿到鎖,這時候a繼續(xù)執(zhí)行第二步進行解鎖如果不加校驗,就將b持有的鎖就給刪除了
避免死鎖
出現(xiàn)死鎖就會導(dǎo)致后續(xù)的任何服務(wù)都拿不到鎖,不能再對共享資源進行任何操作了
保證加鎖與解鎖操作是原子性操作
這個其實屬于是實現(xiàn)分布式鎖的問題,假設(shè)a用redis實現(xiàn)分布式鎖
假設(shè)加鎖操作,操作步驟分為兩步:
1,設(shè)置key set(key,value)2,給key設(shè)置過期時間
假設(shè)現(xiàn)在a剛實現(xiàn)set后,程序崩了就導(dǎo)致了沒給key設(shè)置過期時間就導(dǎo)致key一直存在就發(fā)生了死鎖
如何實現(xiàn)分布式鎖
實現(xiàn)分布式鎖的方式有很多,只要滿足上述條件的都可以實現(xiàn)分布式鎖,比如數(shù)據(jù)庫,redis,zookeeper,在這里就先講一下如何使用redis實現(xiàn)分布式鎖
分布式鎖實現(xiàn)的關(guān)鍵是在分布式的應(yīng)用服務(wù)器外,搭建一個存儲服務(wù)器,存儲鎖信息,這時候我們很容易就想到了Redis。首先我們要搭建一個Redis服務(wù)器,用Redis服務(wù)器來存儲鎖信息。
使用redis實現(xiàn)分布式鎖
使用redis命令 set key value NX EX max-lock-time 實現(xiàn)加鎖
使用redis命令 EVAL 實現(xiàn)解鎖
在實現(xiàn)的時候要注意的幾個關(guān)鍵點:
1、鎖信息必須是會過期超時的,不能讓一個線程長期占有一個鎖而導(dǎo)致死鎖;
2、同一時刻只能有一個線程獲取到鎖。
幾個要用到的redis命令:
setnx(key, value):“set if not exits”,若該key-value不存在,則成功加入緩存并且返回1,否則返回0。
get(key):獲得key對應(yīng)的value值,若不存在則返回nil。
getset(key, value):先獲取key對應(yīng)的value值,若不存在則返回nil,然后將舊的value更新為新的value。
expire(key, seconds):設(shè)置key-value的有效期為seconds秒。
看完了這篇文章,相信你對redis分布式鎖的實現(xiàn)原理有了一定的了解,想了解更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。