溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么通過redis實現(xiàn)分布式鎖

發(fā)布時間:2020-06-23 20:50:28 來源:億速云 閱讀:136 作者:元一 欄目:關(guān)系型數(shù)據(jù)庫

本篇文章展示了通過redis實現(xiàn)分布式鎖的具體操作,代碼簡明扼要容易理解,絕對能讓你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

分布式鎖是控制分布式系統(tǒng)之間同步訪問共享資源的一種方式。在分布式系統(tǒng)中,常常需要協(xié)調(diào)他們的動作。如果不同的系統(tǒng)或是同一個系統(tǒng)的不同主機之間共享了一個或一組資源,那么訪問這些資源的時候,往往需要互斥來防止彼此干擾來保證一致性,在這種情況下,便需要使用到分布式鎖。

分布式鎖需要解決的問題

互斥性:任意時刻只能有一個客戶端擁有鎖,不能同時多個客戶端獲取

安全性:鎖只能被持有該鎖的用戶刪除,而不能被其他用戶刪除

死鎖:獲取鎖的客戶端因為某些原因而宕機,而未能釋放鎖,其他客戶端無法獲取此鎖,需要有機制來避免該類問題的發(fā)生

容錯:當(dāng)部分節(jié)點宕機,客戶端仍能獲取鎖或者釋放鎖

如何通過Redis實現(xiàn)分布式鎖:

SETNX key value :如果key不存在,則創(chuàng)建并賦值

時間復(fù)雜度: 0(1)

返回值:設(shè)置成功,返回1;設(shè)置失敗,返回0。

但是此時我們獲取的key是長期有效的,所以我們應(yīng)該如何解決長期有效的問題呢?

EXPIRE key seconds

設(shè)置key的生存時間,當(dāng)key過期時(生存時間為0) ,會被自動刪除

缺點:原子性得不到滿足

下面是偽代碼

//該程序存在危險,如果執(zhí)行到第二行就崩潰了,則此時key會被一直占用而無法被釋放
RedisService redisService = SpringUtils.getBean(Redi sService.class); 
long status = redisService.setnx(key, "1");
if(status == 1) {
	redisService.expire(key, expire);
	//執(zhí)行獨占資源邏輯
	doOcuppiedWork();
}

Redis實現(xiàn)分布式鎖:

SET key value [EX seconds] [PX milliseconds] [NX|XX]

EX second :設(shè)置鍵的過期時間為second秒

PX millisecond :設(shè)置鍵的過期時間為millisecond毫秒

NX :只在鍵不存在時,才對鍵進行設(shè)置操作

XX:只在鍵已經(jīng)存在時,才對鍵進行設(shè)置操作

SET操作成功完成時,返回OK ,否則返回nil

下面是偽代碼

RedisService redisService = SpringUtils.getBean(RedisService.class); .
String result = redisService.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);
if ("OK".equals(result)) {
	//執(zhí)行獨占資源邏輯
	doOcuppiedWork();
}

大量的key同時過期的注意事項

集中過期,由于清除大量的key很耗時,會出現(xiàn)短暫的卡頓現(xiàn)象

解放方案:在設(shè)置key的過期時間的時候,給每個key加上隨機值

看完上述內(nèi)容,你們掌握通過redis實現(xiàn)分布式鎖的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI