基於redis的分布式鎖

2021-10-02 09:25:08 字數 3361 閱讀 5861

因為伺服器使用了集群方案。詞窮。。。

實現乙個查詢資料庫,在大於0的情況下減庫存這樣小小的功能。

測試:模擬100併發並看結果

public string reducestock() else

return "helloworld";

}用測壓工具測壓結果:出現併發問題

}單機測試結果:沒有問題

分布式測試結果:出現執行緒安全問題

分析,如下圖所示:

兩個微服務,synchronized關鍵字只能鎖住乙個微服務,跨微服務是鎖不住的。

就像你家的屋子a複製乙份為b,a是否鎖門和b是否鎖門是沒有關係的。

基於redis的setnx命令實現分布式鎖

setnx命令的特點是:當你第一次設定的時候會返回1,後面在設定的時候就會返回0(即修改失敗),如下圖所示

分析---邏輯:先獲取鎖,如果獲取鎖,就繼續;否則就不執行

---問題:容易出現死鎖。如果我獲取鎖成功後在執行業務邏輯的過程**現異常,則釋放鎖的過程就沒有了,不釋放鎖就會引起死鎖

public string reducestock()

//查資料庫(redis)中庫存數量

integer stock = integer.parseint(stringredistemplate.opsforvalue().get("stock"));

//判斷庫存

if (stock > 0) else

// del key 釋放鎖邏輯

stringredistemplate.delete(lockkey);

return "helloworld";

}分析:---優點:在finally中釋放鎖,解決了死鎖的問題

---問題:引起鎖失效問題。看下面的**,先加鎖,如果加鎖失敗,返回,但是此時**也會去執行finally中釋放鎖的功能,從而使別人加的鎖失效。

public string reducestock()

//查資料庫(redis)中庫存數量

integer stock = integer.parseint(stringredistemplate.opsforvalue().get("stock"));

//判斷庫存

if (stock > 0) else

} catch (exception e) finally

return "helloworld";

}分析:--優點:解決了鎖失效問題

--問題:沒有解決因為宕機而引起的死鎖,如下圖所示,微服務8082獲取鎖後在執行業務邏輯時系統宕機後就會引起死鎖

}分析:--優點:加鎖邏輯時設定過期時間,可以解決三代**的死鎖問題,系統中斷了我到時間就自動釋放鎖

--問題:我設定的時間是30秒(隨機想的乙個數),假設我的業務邏輯是35,那會引起鎖失效。如下圖所示

}分析:--優點:解決了四代**的鎖失效問題

--缺點:如下圖所示,如果我設定失效時間是30,而我業務邏輯時間是35,在30-35之間是有兩個執行緒同時訪問,這與獨佔鎖是矛盾的,所以此處存在問題。

}我們現在的瓶頸就是超時時間的設定。

如果設定短了會出現五代**的問題;如果設定長了,你不能保證業務邏輯一定會比你設定的時間短,就算你設定的時間長,10分鐘,那萬一系統中斷10分鐘內不能有業務處理,也是不可取的。

如果我們能動態修改這個超時時間,那就無敵了 

其實還有乙個問題,這短**的邏輯是獲取鎖失敗後直接返回,其實應該繼續嘗試獲取

向redis集群寫資料的步驟是: 

1)向master節點寫資料

2) master節點返回

3)master節點同步到子節點

如果 執行緒t1 獲取鎖,寫入乙個資料    1)  2)成功後 此時master 節點掉線了, 在子節點中選乙個master,但是這個master是沒有t1寫的資料,此時此刻t2是可以獲取到鎖的,這個是redis做分布式鎖的瑕疵。

redis是高效能分布式鎖,zk是高可靠分布式鎖,看你看重效能還是一致性了。

apache jmeter  

安裝  

使用 

基於redis的分布式鎖

public class redislock 加鎖 取到鎖加鎖,並返回值用於解鎖 取不到鎖則立即返回 1 param millitimeout 最長鎖定時間,超時後自動刪除鎖,避免死鎖 return public synchronized long lock long millitimeout lo...

基於 Redis 的分布式鎖

分布式鎖在分布式應用中應用廣泛,想要搞懂乙個新事物首先得了解它的由來,這樣才能更加的理解甚至可以舉一反三。首先談到分布式鎖自然也就聯想到分布式應用。在我們將應用拆分為分布式應用之前的單機系統中,對一些併發場景讀取公共資源時如扣庫存,賣車票之類的需求可以簡單的使用同步或者是加鎖就可以實現。但是應用分布...

基於Redis的分布式鎖

the real target is that i was asked theredis鎖usage in the interview.and i cann t answer it.真正目的是因為在面試中被問到多執行緒這塊怎麼實現的,當時只是看了下 是用redis鎖實現的,至於具體的細節。自己回答的...