Redis 分布式鎖的作用及實現(序列四)

2022-06-19 10:57:14 字數 2682 閱讀 1570

一、什麼是分布式鎖?

要介紹分布式鎖,首先要提到與分布式鎖相對應的是執行緒鎖、程序鎖。

執行緒鎖:主要用來給方法、**塊加鎖。當某個方法或**使用鎖,在同一時刻僅有乙個執行緒執行該方法或該**段。執行緒鎖只在同一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秒。

看一下流程圖:

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

我採用jedis作為redis客戶端的api,下面來看一下具體實現的**。

(1)首先要建立乙個redis連線池。

public

class

redispool

public

static

jedis getjedis()

public

static

void

close(jedis jedis)

private

static

void

initpool()

}

(2)對jedis的api進行封裝,封裝一些實現分布式鎖需要用到的操作。

public

class

redispoolutil

private

static

redispool redispool;

public

static string get

(string key)

catch

(exception e)

finally

return

result;}}

public

static

long setnx(string key, string value)

catch

(exception e)

finally

return

result;}}

public

static

string getset(string key, string value)

catch

(exception e)

finally

return

result;}}

public

static long expire(string key, int

seconds)

catch

(exception e)

finally

return

result;}}

public

static

long del(string key)

catch

(exception e)

finally

return

result;}}

}

(3)分布式鎖工具類

public

class

distributedlockutil

public

static boolean lock(string lockname)

else

else

} else}}

}

分布式鎖 使用Redis實現分布式鎖

關於分布式鎖的實現,我的前一篇文章講解了如何使用zookeeper實現分布式鎖。關於分布式鎖的背景此處不再做贅述,我們直接討論下如何使用redis實現分布式鎖。關於redis,筆主不打算做長篇大論的介紹,只介紹下redis優秀的特性。支援豐富的資料型別,如string list map set zs...

Redis分布式鎖原理及實現

ps 該篇博文目錄為 redis分布式鎖使用 中的 有瑕疵,為避免錯誤使用,請移步 感興趣的也可以看看到底瑕疵在哪 解決問題 多個程序多台機器,對乙個資料進行的操作的互斥。比如,下訂單和扣庫存的操作,這兩個操作必須連貫,乙個執行緒執行完這兩個操作後,下面乙個執行緒才可以介入執行,如果同時併發執行,極...

redis實現分布式鎖

隨便 系統越來越大,各功能模組除了垂直切割以外,同時也得做集群處理,那麼問題來了,在多執行緒情況下對於資源的競爭就需要乙個統一的訪問限制。以選課系統為例子,集群中各節點對課程可選數量同時操作,這裡就需要同步了,否則會導致最後選到的數量比可選的數量大,這裡我們的分布式鎖就派上用場了。利用redis來實...