用redis實現分布式鎖

2021-08-17 17:51:20 字數 2034 閱讀 5744

通常部署的服務都是在多台伺服器上,不會只有一台。那麼在分布式環境下,就會遇到共享資源的問題。比如乙個人只能有一條記錄,下次進來就只能修改,而不是再新增。

如果只有一台伺服器,可以使用多執行緒下的單例模式來控制,但是分布式下,就不管用了。

有三種方式,一是使用資料庫的樂觀鎖,二是redis的鎖,三是zookeeper提供的鎖。此處介紹reids的,參考這個**:

以下為呼叫**

string lockkey=「***xkey」;

string requestid=uuid.randomuuid().tostring();

string lockresult=redisutil.lockwithsecond(lockkey,requestid,30);

if(!redisconstants.lock_success.equals(lockresult))

trycatch(exceptionee)finally

redis工具類的加鎖**

/**

* 鎖的超時單位為秒

* @param lockkey,鎖的key(名稱)

*@param requestid,加鎖的客戶端id

*@param expiretime 失效時間

* 返回 ok 表示成功

*/public

static string lockwithsecond(string lockkey,string requestid,int expiretime)

redis工具類的解鎖**

/**

* 解鎖,0-失敗,1-成功

*@return

*/public

static long unlock(string lockkey,string requestid)else

}

其實就是用了jedis提供的方法,myredisclusterforhessian只不過是封裝了集群下獲取jedis的的方法。

核心方法如下:

jedis.set(lockkey, requestid, set_if_not_exist, set_with_expire_time, expiretime);

呼叫的底層實現

/**

* set the string value as value of the key. the string can't be longer than 1073741824 bytes (1

* gb).

*@param key

*@param value

*@param n*** nx|xx, nx -- only set the key if it does not already exist. xx -- only set the key

* if it already exist.

*@param expx ex|px, expire time units: ex = seconds; px = milliseconds

*@param time expire time in the units ofexpx*@return status code reply

*/public string set(final string key, final string value, final string n***, final string expx,

final

long time)

解釋如下:

key,鎖的key(名稱)

requestid,加鎖的客戶端id

n*** nx|xx, nx – 如果不存在設定key,存在則不做; xx – 如果key存在才設定,不存在不做

expx ex|px, ex—失效時間單位為秒,px—失效時間單位為毫秒

time 失效時間長度

返回 ok 表示成功

就是通過uuid來給同乙個key加鎖,不同伺服器,uuid不同,誰鎖的,只能誰解鎖。或者到達超時時間後自動解鎖。

python 用redis實現分布式鎖

在 redis 中設定值,預設,不存在則建立,存在則修改。引數 1.ex 過期時間 秒 這裡過期時間是3秒,3秒後p,鍵food的值就變成none import redis,time redis client redis.strictredis host localhost port 6379,db...

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

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

redis實現分布式鎖

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