您好,登錄后才能下訂單哦!
小編給大家分享一下redis分布式鎖的實現原理,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!
分布式鎖其實可以理解為:控制分布式系統有序的去對共享資源進行操作,通過互斥來保持一致性。
舉個不太恰當的例子:
假設共享的資源就是一個房子,里面有各種書,分布式系統就是要進屋看書的人,分布式鎖就是保證這個房子只有一個門并且一次只有一個人可以進,而且門只有一把鑰匙。然后許多人要去看書,可以,排隊,第一個人拿著鑰匙把門打開進屋看書并且把門鎖上,然后第二個人沒有鑰匙,那就等著,等第一個出來,然后你在拿著鑰匙進去,然后就是以此類推
實現原理
互斥性
保證同一時間只有一個客戶端可以拿到鎖,也就是可以對共享資源進行操作
安全性
只有加鎖的服務才能有解鎖權限,也就是不能讓a加的鎖,bcd都可以解鎖,如果都能解鎖那分布式鎖就沒啥意義了
可能出現的情況就是a去查詢發現持有鎖,就在準備解鎖,這時候忽然a持有的鎖過期了,然后b去獲得鎖,因為a鎖過期,b拿到鎖,這時候a繼續執行第二步進行解鎖如果不加校驗,就將b持有的鎖就給刪除了
避免死鎖
出現死鎖就會導致后續的任何服務都拿不到鎖,不能再對共享資源進行任何操作了
保證加鎖與解鎖操作是原子性操作
這個其實屬于是實現分布式鎖的問題,假設a用redis實現分布式鎖
假設加鎖操作,操作步驟分為兩步:
1,設置key set(key,value)2,給key設置過期時間
假設現在a剛實現set后,程序崩了就導致了沒給key設置過期時間就導致key一直存在就發生了死鎖
如何實現分布式鎖
實現分布式鎖的方式有很多,只要滿足上述條件的都可以實現分布式鎖,比如數據庫,redis,zookeeper,在這里就先講一下如何使用redis實現分布式鎖
分布式鎖實現的關鍵是在分布式的應用服務器外,搭建一個存儲服務器,存儲鎖信息,這時候我們很容易就想到了Redis。首先我們要搭建一個Redis服務器,用Redis服務器來存儲鎖信息。
使用redis實現分布式鎖
使用redis命令 set key value NX EX max-lock-time 實現加鎖
使用redis命令 EVAL 實現解鎖
在實現的時候要注意的幾個關鍵點:
1、鎖信息必須是會過期超時的,不能讓一個線程長期占有一個鎖而導致死鎖;
2、同一時刻只能有一個線程獲取到鎖。
幾個要用到的redis命令:
setnx(key, value):“set if not exits”,若該key-value不存在,則成功加入緩存并且返回1,否則返回0。
get(key):獲得key對應的value值,若不存在則返回nil。
getset(key, value):先獲取key對應的value值,若不存在則返回nil,然后將舊的value更新為新的value。
expire(key, seconds):設置key-value的有效期為seconds秒。
看完了這篇文章,相信你對redis分布式鎖的實現原理有了一定的了解,想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。