redis分布式鎖

起因:redis分布式鎖自己用過、也看過一些文章,但是總是會(huì)是有不懂之處,于是寫一遍,必須給他安排的明明白白

為什么使用

分布式鎖拆一下是兩個(gè)點(diǎn)


  • 鎖的概念叛薯,從操作系統(tǒng)到語言使用都有使用,就是一個(gè)資源的使用笙纤,一次只能有一個(gè)單位去用耗溜,并發(fā)競爭的情況下,就需要加鎖來保證省容,一個(gè)人使用抖拴,使用完解鎖,再下一個(gè)使用腥椒,如此阿宅。所以鎖是串行化了并發(fā)操作,也會(huì)影響性能笼蛛。
  • 分布式
    分布式環(huán)境洒放,其實(shí)是集群環(huán)境,就是一個(gè)應(yīng)用部署了多份滨砍,多份同樣的代碼都在跑往湿,單體應(yīng)用上使用java的鎖,已經(jīng)不適用于分布式環(huán)境了惋戏,于是需要第三方來協(xié)調(diào)领追,如zk、redis等日川;第三方來管理鎖蔓腐,多臺(tái)機(jī)器在第三方去獲得鎖矩乐,解鎖龄句。
    所以回论,由于現(xiàn)在的應(yīng)用基本都是分布式集群環(huán)境,鎖就演變成了分布式鎖

怎么使用

引入

java語言的鎖通過狀態(tài)管理分歇,我獲得了鎖傀蓉,我的狀態(tài)改為1,解鎖再改為0职抡,如此來管理競爭鎖的線程(lock) redis中的鎖結(jié)合redis的特性葬燎,就是通過redis設(shè)置一個(gè)值,解鎖時(shí)刪除缚甩,因?yàn)槭歉偁幤拙唬灾荒苡幸粋€(gè)set成功

解決原子性問題

  • 因此需要使用setnx,只有redis中沒有這個(gè)key才會(huì)set成功
  • set之后需要del來解鎖擅威,這里分布式環(huán)境下很明顯兩個(gè)操作是要保證原子性的壕探;因此set再del不行,set再expire也不行(兩步操作郊丛,后一步可能執(zhí)行不到陷入死鎖)李请;因此redis2.8版本更新了set操作,通過setnx ex來保證原子性厉熟,如 set lock:user true ex 5 nx

超時(shí)問題

有一個(gè)問題是在加鎖和解鎖之間导盅,執(zhí)行任務(wù)邏輯的時(shí)候,如果沒執(zhí)行完就到了超時(shí)時(shí)間釋放了鎖揍瑟,第二個(gè)線程進(jìn)來持有了鎖白翻,臨界區(qū)代碼沒有嚴(yán)格串行執(zhí)行,將會(huì)產(chǎn)生問題(因此分布式鎖也不適合做長時(shí)間的任務(wù))
有個(gè)稍微安全又簡單的方案是set value為一個(gè)隨機(jī)數(shù)月培,在釋放時(shí)匹配隨機(jī)數(shù)嘁字,一致再釋放,可以保證當(dāng)前線程的鎖不會(huì)被其他線程釋放杉畜。redis中沒有這種操作纪蜒,因此需要使用lua來執(zhí)行并保證原子性操作

if redis.call("get",KEYS[1]) == ARGV[1] then 
  return redis.call
else
  return 0
end

在實(shí)際使用時(shí),可對這部分try catch此叠,在finally中可以釋放鎖纯续,提前執(zhí)行完畢時(shí)先釋放鎖提升性能。

集群容錯(cuò)性

redis集群中帶來的容錯(cuò)灭袁,在master掛掉之后猬错,slave中沒有同步到鎖,因此新的master沒有鎖茸歧,加鎖成功之后倦炒,有多個(gè)鎖就不安全了。
redlock算法解決這個(gè)問題软瞎,思路也比較簡單逢唤,需要多個(gè)redis master節(jié)點(diǎn)拉讯,采用過半機(jī)制,加鎖時(shí)鳖藕,對過半節(jié)點(diǎn)發(fā)送set(key,value,nx,ex)指令魔慷,過半成功則成功,釋放同樣發(fā)送del指令著恩,比較消耗性能院尔。

分布式鎖如深究還有可重入性包裝等,待更新喉誊,以上內(nèi)容如不對請指出邀摆!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市伍茄,隨后出現(xiàn)的幾起案子隧熙,更是在濱河造成了極大的恐慌,老刑警劉巖幻林,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贞盯,死亡現(xiàn)場離奇詭異,居然都是意外死亡沪饺,警方通過查閱死者的電腦和手機(jī)躏敢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來整葡,“玉大人件余,你說我怎么就攤上這事≡饩樱” “怎么了啼器?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長俱萍。 經(jīng)常有香客問我端壳,道長,這世上最難降的妖魔是什么枪蘑? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任损谦,我火速辦了婚禮,結(jié)果婚禮上岳颇,老公的妹妹穿的比我還像新娘照捡。我一直安慰自己,他們只是感情好话侧,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布栗精。 她就那樣靜靜地躺著,像睡著了一般瞻鹏。 火紅的嫁衣襯著肌膚如雪悲立。 梳的紋絲不亂的頭發(fā)上赢赊,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天,我揣著相機(jī)與錄音级历,去河邊找鬼。 笑死叭披,一個(gè)胖子當(dāng)著我的面吹牛寥殖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播涩蜘,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼嚼贡,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了同诫?” 一聲冷哼從身側(cè)響起粤策,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎误窖,沒想到半個(gè)月后叮盘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡霹俺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年柔吼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丙唧。...
    茶點(diǎn)故事閱讀 39,745評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡愈魏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出想际,到底是詐尸還是另有隱情培漏,我是刑警寧澤,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布胡本,位于F島的核電站牌柄,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏侧甫。R本人自食惡果不足惜友鼻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望闺骚。 院中可真熱鬧彩扔,春花似錦、人聲如沸僻爽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胸梆。三九已至敦捧,卻和暖如春须板,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背兢卵。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工习瑰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人秽荤。 一個(gè)月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓甜奄,卻偏偏與公主長得像,于是被迫代替她去往敵國和親窃款。 傳聞我的和親對象是個(gè)殘疾皇子课兄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評論 2 354