分佈式鎖的作用及實現(Redis)

一、什麼是分佈式鎖?
要介紹分佈式鎖,首先要提到與分佈式鎖相對應的是線程鎖、進程鎖。

線程鎖:主要用來給方法、代碼塊加鎖。當某個方法或代碼使用鎖,在同一時刻僅有一個線程執行該方法或該代碼段。線程鎖只在同一JVM中有效果,因爲線程鎖的實現在根本上是依靠線程之間共享內存實現的,比如synchronized是共享對象頭,顯示鎖Lock是共享某個變量(state)。

進程鎖:爲了控制同一操作系統中多個進程訪問某個共享資源,因爲進程具有獨立性,各個進程無法訪問其他進程的資源,因此無法通過synchronized等線程鎖實現進程鎖。

分佈式鎖:當多個進程不在同一個系統中,用分佈式鎖控制多個進程對資源的訪問。

二、分佈式鎖的使用場景。
線程間併發問題和進程間併發問題都是可以通過分佈式鎖解決的,但是強烈不建議這樣做!因爲採用分佈式鎖解決這些小問題是非常消耗資源的!分佈式鎖應該用來解決分佈式情況下的多進程併發問題纔是最合適的。

有這樣一個情境,線程A和線程B都共享某個變量X。

如果是單機情況下(單JVM),線程之間共享內存,只要使用線程鎖就可以解決併發問題。

如果是分佈式情況下(多JVM),線程A和線程B很可能不是在同一JVM中,這樣線程鎖就無法起到作用了,這時候就要用到分佈式鎖來解決。

三、分佈式鎖的實現(Redis)
分佈式鎖實現的關鍵是在分佈式的應用服務器外,搭建一個存儲服務器,存儲鎖信息,這時候我們很容易就想到了Redis。首先我們要搭建一個Redis服務器,用Redis服務器來存儲鎖信息。

在實現的時候要注意的幾個關鍵點:

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秒。

看一下流程圖:

在這個流程下,不會導致死鎖。

轉自:https://blog.csdn.net/L_BestCoder/article/details/79336986

 

 

 

 

 


--------------------- 
作者:LiQiyaoo 
來源:CSDN 
原文:https://blog.csdn.net/L_BestCoder/article/details/79336986 
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章