日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
Redis鎖爭(zhēng)奪失敗的無(wú)奈與掙扎(redis獲取不到鎖)

Redis作為常用的內(nèi)存數(shù)據(jù)庫(kù),在高并發(fā)場(chǎng)景下起到了至關(guān)重要的作用。而在高并發(fā)場(chǎng)景中,往往會(huì)出現(xiàn)多個(gè)線(xiàn)程對(duì)同一個(gè)資源進(jìn)行爭(zhēng)奪的情況。在這種情況下,使用Redis鎖進(jìn)行資源的互斥訪(fǎng)問(wèn)是一種常見(jiàn)的方法。但是,在實(shí)際應(yīng)用中,我們也會(huì)遇到Redis鎖爭(zhēng)奪失敗的情況,這時(shí)候我們?cè)撛趺崔k呢?

公司主營(yíng)業(yè)務(wù):成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、成都外貿(mào)網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶(hù)真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)建站是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶(hù)帶來(lái)驚喜。創(chuàng)新互聯(lián)建站推出富源免費(fèi)做網(wǎng)站回饋大家。

Redis鎖爭(zhēng)奪失敗的原因

在Redis中使用鎖時(shí),我們通常會(huì)使用setnx指令。這個(gè)指令會(huì)嘗試在Redis中創(chuàng)建一個(gè)鍵值對(duì),如果這個(gè)鍵值對(duì)不存在,那么就創(chuàng)建成功,并返回1;否則,不進(jìn)行任何操作,并返回0。我們可以通過(guò)這個(gè)特性來(lái)實(shí)現(xiàn)鎖定和解鎖的操作。

但是,由于網(wǎng)絡(luò)延遲、Redis集群分片以及其他一些因素,setnx指令執(zhí)行可能會(huì)失敗。當(dāng)多個(gè)線(xiàn)程開(kāi)始爭(zhēng)用同一個(gè)資源時(shí),可能會(huì)出現(xiàn)如下的情況:

1. 線(xiàn)程1獲得了資源,并使用setnx將其鎖定;

2. 線(xiàn)程2嘗試獲得這個(gè)資源,但發(fā)現(xiàn)已經(jīng)被鎖定了,于是等待;

3. 在等待期間,線(xiàn)程1處理時(shí)間過(guò)長(zhǎng),Redis的超時(shí)機(jī)制將其釋放;

4. 線(xiàn)程3嘗試獲得這個(gè)資源,由于它現(xiàn)在是可用的,于是搶占成功;

5. 線(xiàn)程1最后完成了處理,試圖解鎖,但是由于此時(shí)資源已經(jīng)被線(xiàn)程3占用,所以它解鎖失敗。

對(duì)于這種情況,我們可以采用以下幾種方法來(lái)解決:

1. 設(shè)置鎖超時(shí)時(shí)間

由于Redis鎖的特殊使用場(chǎng)景,鎖的持有時(shí)間肯定是比較短的,因此我們可以設(shè)置一個(gè)鎖的超時(shí)時(shí)間,在這個(gè)時(shí)間內(nèi)如果鎖沒(méi)有被解除則Redis會(huì)自動(dòng)解鎖,防止資源一直處于鎖定狀態(tài)??梢允褂靡韵麓a實(shí)現(xiàn):

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

2. 重試機(jī)制

當(dāng)鎖定失敗時(shí),我們可以考慮進(jìn)行一些等待和重試的操作。這里我們可以根據(jù)實(shí)際業(yè)務(wù)需要,設(shè)置不同的等待時(shí)間和重試次數(shù)。具體代碼實(shí)現(xiàn)如下:

public boolean tryAcquireDistributedLock(Jedis jedis, string lockKey, String requestId, int expireTime, int retryTimes, int sleepMills) {
int times = 0;
while (times
String result = jedis.set(lockKey, requestId, "NX", "EX", expireTime);
if ("OK".equalsIgnoreCase(result)) {
return true;
}
//等待重試
try {
Thread.sleep(sleepMills);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return false;
}

3. 前置條件檢查

在嘗試獲得鎖之前,我們可以先檢查一下資源是否已經(jīng)被鎖定。如果已經(jīng)被鎖定,就可以直接返回失敗,無(wú)需進(jìn)行后續(xù)處理。具體代碼實(shí)現(xiàn)如下:

public boolean tryAcquireDistributedLock(Jedis jedis, String lockKey, String requestId, int expireTime) {
String result = jedis.set(lockKey, requestId, "NX", "EX", expireTime);
if ("OK".equalsIgnoreCase(result)) {
return true;
}
return false;
}
public boolean tryAcquireDistributedLockWithCheck(Jedis jedis, String lockKey, String requestId, int expireTime) {
//檢查前置條件
if (jedis.get(lockKey) != null) {
return false;
}
return tryAcquireDistributedLock(jedis, lockKey, requestId, expireTime);
}

總結(jié)

在高并發(fā)場(chǎng)景下,如何保證資源的互斥訪(fǎng)問(wèn)是一個(gè)比較復(fù)雜的問(wèn)題。而使用Redis鎖是一種比較常見(jiàn)的方法。但是,在實(shí)際應(yīng)用中,我們也會(huì)遇到Redis鎖爭(zhēng)奪失敗的情況,這時(shí)候我們需要采取一些特殊的操作來(lái)防止出現(xiàn)競(jìng)爭(zhēng)問(wèn)題。本文介紹了三種常見(jiàn)的方法,供大家參考。

創(chuàng)新互聯(lián)服務(wù)器托管擁有成都T3+級(jí)標(biāo)準(zhǔn)機(jī)房資源,具備完善的安防設(shè)施、三線(xiàn)及BGP網(wǎng)絡(luò)接入帶寬達(dá)10T,機(jī)柜接入千兆交換機(jī),能夠有效保證服務(wù)器托管業(yè)務(wù)安全、可靠、穩(wěn)定、高效運(yùn)行;創(chuàng)新互聯(lián)專(zhuān)注于成都服務(wù)器托管租用十余年,得到成都等地區(qū)行業(yè)客戶(hù)的一致認(rèn)可。


文章題目:Redis鎖爭(zhēng)奪失敗的無(wú)奈與掙扎(redis獲取不到鎖)
文章起源:http://www.dlmjj.cn/article/dhjjhco.html