當前位置:編程學習大全網 - 編程語言 - Redis怎麽實現分布式鎖

Redis怎麽實現分布式鎖

阿粉最近迷上了 Redis,為什麽呢?感覺 Redis 確實功能很強大呀,壹個基於內存的系統 Key-Value 存儲的數據庫,竟然有這麽多的功能,而阿粉也要實實在在地把 Redis 來弄壹下,畢竟面試的時候,Redis 可以說是壹個非常不錯的加分項。

為什麽需要分布式鎖?

目前很多的大型項目全部都是基於分布式的,而分布式場景中的數據壹致性問題壹直是壹個不可忽視的問題,大家知道關於分布式的 CAP 理論麽?

CAP 理論就是說任何壹個分布式系統都無法同時滿足壹致性(Consistency)、可用性(Availability)和分區容錯性(Partition tolerance),最多只能同時滿足兩項。

而我們的系統最終滿足的永遠都是最終壹致性,而這種最終壹致性,有些時候有人會喜歡問關於分布式事務,而有些人則偏重在分布式鎖上。

但是阿粉選擇的就是使用緩存來實現分布式鎖,也就是我們在項目中最經常使用的 Redis ,談到 Redis,那真是可以用在太多地方了,比如說:

我們今天就來實現用 Redis 來實現分布式鎖,並且要學會怎麽使用。

1.準備使用 Jedis 的 jar 包,在項目中導入 jar 包。

jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime); 這個加鎖的姿勢才是我們最需要了解的,不然妳用的時候都不知道怎麽使用。

key:加鎖的鍵,實際上就是相當於壹個唯壹的標誌位,不同的業務,妳可以使用不同的標誌位進行加鎖。

requestId:這個東西實際上就是用來標識他是哪壹個請求進行的加鎖,因為在分布式鎖中,我們要知道壹件事,就是加鎖的和解鎖的,必須是同壹個客戶端才可以。

而且還有壹種比較經典的就是 B 把 A 的鎖給釋放了,導致釋放混亂,如果妳不加相同的請求,A 線程處理業務,執行了加鎖,鎖的過期時間是5s, B線程嘗試獲取鎖,如果 A 處理業務時間超過5s,這時候 A 就要開始釋放鎖,而B在這時候沒有檢測到這個鎖,從而進行了加鎖,這時候加鎖的時候,A還沒處理完對應業務,當他處理完了之後,再釋放鎖的話,要是就是直接把 B 剛加的鎖釋放了,要麽就是壓根都沒辦法釋放鎖。

SET_IF_NOT_EXIST:看字面意思,如果 key 不存在,我們進行Set操作,如果存在,啥都不幹,也就不在進行加鎖。

SET_WITH_EXPIRE_TIME:是否過期

expireTime:這是給 key 設置壹個過期的時間,萬壹妳這業務壹直被鎖著了,然後之後的業務想加鎖,妳直接給壹直持有這個這個鎖,不進行過期之後的釋放,那豈不是要涼了。

上面的方法中 tryGetDistributedLock 這個方法也就是我們通常使用的加鎖的方法。

大家看到這個 script 的時候,會感覺有點奇怪,實際上他就是壹個 Lua 的腳本,而 Lua 腳本的意思也比較簡單。

其實這時候就有些人說,直接 del 刪除不行麽?妳試試妳如果這麽寫的話,妳們的領導會不會把妳的腿給妳打斷。

這種不先判斷鎖的擁有者而直接解鎖的方式,會導致任何客戶端都可以隨時進行解鎖,也就是說,這鎖就算不是我加的,我都能開,這怎麽能行呢?

在這裏給大家放壹段使用的代碼,比較簡單,但是可以直接用到妳們的項目當中

我們先把這個實現方式實現了,然後我們再來說說大家最不願意看的理論知識,畢竟這理論知識是妳面試的時候經常會被問到的。

分布式CAP理論:

加州大學伯克利分校的 Eric Brewer 教授在 ACM PODC 會議上提出 CAP 猜想。2年後,麻省理工學院的 Seth Gilbert 和 Nancy Lynch 從理論上證明了 CAP。之後,CAP 理論正式成為分布式計算領域的公認定理。

也就是說,在二十年前的時候,CAP 理論只是個猜想。結果兩年之後被證實了,於是,大家在考慮分布式的時候,就有根據來想了,不再是空想了。

什麽是分布式的 CAP 理論 ?

壹個分布式系統最多只能同時滿足壹致性(Consistency)、可用性(Availability)和分區容錯性(Partition tolerance)這三項中的兩項

這個和(Atomicity)不太壹樣,因為之前看有些人說,在 CAP 理論中的 A 和數據庫事務中的 A 是壹樣的,單詞都不壹樣,那能壹樣麽?

Availability :分布式中的 A 表示的是可用性,也就是說服務壹直可用,而且是正常響應時間。

而妳在搭建分布式系統的時候,要保證每個節點都是穩定的,不然妳的可用性就沒有得到相對應的保證,也談不上是什麽分布式了。只能稱之為壹個偽分布式。

Consistency: 壹致性

也就是說妳的更新操作成功並返回客戶端完成後,所有節點在同壹時間的數據完全壹致,這個如果妳在使用 Redis 做數據展示的時候,很多面試官都會問妳,那妳們是怎麽保證數據庫和緩存的壹致性的呢?

畢竟妳只是讀取的話,沒什麽問題,但是設計到更新的時候,不管是先寫數據庫,再刪除緩存;還是先刪除緩存,再寫庫,都有可能出現數據不壹致的情況。

所以如果妳對這個很感興趣,可以研究壹下,比如說:

如果妳能在面試的時候把這些都給面試官說清楚,至少感覺妳應該能達到妳自己的工資要求。

Partition tolerance:分區容錯性

分布式系統在遇到某節點或網絡分區故障的時候,仍然能夠對外提供滿足壹致性和可用性的服務。

其實在 CAP 理論當中,我們是沒有辦法同時滿足壹致性、可用性和分區容錯性這三個特性,所以有所取舍就可以了。

關於使用 Redis 分布式鎖,大家學會了麽?

  • 上一篇:如何用樹莓派Raspberry Pi做壹個簡單的控制系統
  • 下一篇:家鄉的棗樹怎麽寫作文?
  • copyright 2024編程學習大全網