redis分布式鎖

2022-06-18 22:36:18 字數 2000 閱讀 5541

weixin_34377919

2019-02-07 02:45:03

965 

收藏 2

版權我們在開發很多業務場景會使用到鎖,例如庫存控制,**等。一般我們會使用記憶體鎖的方式來保證線性的執行。但現在大多站點都會使用分布式部署,那多台伺服器間的就必須使用同乙個目標來判斷鎖。分布式與單機情況下最大的不同在於其不是多執行緒而是多程序。

[分布式站點使用記憶體鎖方式如下圖]

假設有3個使用者同時購買一件商品,商品庫存只剩下1,如果3個使用者同時購買,負載均衡把3個使用者分別指向站點1、2、3,那結果將會是3個使用者都購買成功。下面我們使用分布式鎖解決這個問題。

[分布式站點使用分布式鎖如下圖]

單台伺服器由於可以共享堆記憶體,因此可以簡單的採取記憶體作為標記儲存位置。而多伺服器之間都不在同一臺物理機上,因此需要將標記儲存在乙個所有程序都能看到的地方。

想想我們實現分布式鎖要滿足哪些條件?

1、在分布式系統環境下,乙個鎖在同一時間只能被乙個伺服器獲取;(這是所有分布式鎖的基礎) 

2、高效能的獲取鎖和釋放鎖;(鎖用完了,要及時釋放,以供別人繼續使用)

3、具備鎖失效機制,防止死鎖;(防止因為某些意外,鎖沒有得到釋放,那別人將永遠無法使用)

4、具備非阻塞鎖特性,即沒有獲取到鎖將直接返回獲取鎖失敗。(滿足等待鎖的同時,也要滿足非阻塞鎖特性,便於多樣性的業務場景使用)

分布式鎖有很多的實現方式:資料庫排他鎖、zookeeper、快取(redis、memcached)等,本文選用redis實現。原因如下:

1、redis有很高的效能;

2、redis命令對此支援較好,實現起來比較方便;

redis官網上對c#的使用推薦有servicestack.redis和stackexchange.redis

由於stackexchange.redis雖然有提供locktake方法,很方便的使用鎖,但是只支援.net4.5以上。公司很多站點都是3.5和4.0的,所以選用servicestack.redis,自己封裝一下。

1、setnx

setnx key val:當且僅當key不存在時,set乙個key為val的字串,返回1;若key存在,則什麼都不做,返回0。

2、expire

expire key timeout:為key設定乙個超時時間,單位為second,超過這個時間鎖會自動釋放,避免死鎖。

3、delete

delete key:刪除key

在使用redis實現分布式鎖的時候,主要就會使用到這三個命令。

1、鎖方法

///

/// 分布式鎖

///

/// 鎖key

/// 鎖自動超時時間(秒)

/// 等待鎖時間(秒)

///

public static bool lock(string key, int lockexpiryseconds = 10, double waitlockseconds = 0)

) == 1)

//不等待鎖則返回

if (waitlockseconds == 0) break;

//超過等待時間,則不再等待

if ((datetime.now - begin).totalseconds >= waitlockseconds) break;

thread.sleep(waitintervalms);

}return false;}}

2、釋放鎖

///

/// 刪除鎖 執行完**以後呼叫釋放鎖

///

///

public static void dellock(string key)

}3、業務應用**

try}

finally

redis分布式鎖

redis分布式鎖 直接上 我寫了四個redis分布式鎖的方法,大家可以提個意見 第一種方法 redis分布式鎖 param timeout public void lock long timeout thread.sleep 100 catch exception e override publi...

Redis分布式鎖

分布式鎖一般有三種實現方式 1.資料庫樂觀鎖 2.基於redis的分布式鎖 3.基於zookeeper的分布式鎖.首先,為了確保分布式鎖可用,我們至少要確保鎖的實現同時滿足以下四個條件 互斥性。在任意時刻,只有乙個客戶端能持有鎖。不會發生死鎖。即使有乙個客戶端在持有鎖的期間崩潰而沒有主動解鎖,也能保...

redis分布式鎖

使用redis的setnx命令實現分布式鎖 redis為單程序單執行緒模式,採用佇列模式將併發訪問變成序列訪問,且多個客戶端對redis的連線並不存在競爭關係。redis的setnx命令可以方便的實現分布式鎖。setnx key value 將key的值設為value,當且僅當key不存在。如給定的...