新聞中心
在分布式環(huán)境中,對(duì)資源的訪問往往需要排除來自并發(fā)的多個(gè)請(qǐng)求的競爭,使用Redis鎖加強(qiáng)了對(duì)資源的保護(hù),將鎖的管理從應(yīng)用本身中獨(dú)立出來,統(tǒng)一由Redis服務(wù)器來進(jìn)行控 制。然而,在實(shí)際開發(fā)中,遇到Redis異常,往往需要切換到另一個(gè)Redis實(shí)例,Redis lock受到非常多的開發(fā)者關(guān)注,它極大的提高了應(yīng)用的性能和安全性,但是,切換Redis Lock是一個(gè)比較艱難的過程。

成都服務(wù)器托管,成都創(chuàng)新互聯(lián)公司提供包括服務(wù)器租用、資陽主機(jī)托管、帶寬租用、云主機(jī)、機(jī)柜租用、主機(jī)租用托管、CDN網(wǎng)站加速、域名與空間等業(yè)務(wù)的一體化完整服務(wù)。電話咨詢:028-86922220
需要確定在切換Redis Lock時(shí),舊的Lock是否還存在,否則新的Lock可能會(huì)和舊的Lock發(fā)生沖突,另一方面,同一個(gè)Lock可能在多個(gè)節(jié)點(diǎn)上被同時(shí)加鎖,如果不進(jìn)行同步操作,將可能導(dǎo)致資源競爭。為避免舊Lock和新Lock發(fā)生沖突,可以給新Lock提供一個(gè)不與舊Lock同時(shí)存在的新值,如UUID;同時(shí),針對(duì)已經(jīng)存在的鎖,可以在新Redis實(shí)例上同步設(shè)置這個(gè)Lock,以保證兩個(gè)實(shí)例之間的數(shù)據(jù)一致。
//獲取Redis鎖
public boolean getRedisLock(Jedis redis,string params) {
//共享鎖,設(shè)置過期時(shí)間
String result=redis.set(params,params, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, SECONDS);
if(LOCK_SUCCESS.equals(result)) {
return true;
}
return false;
}
//釋放Redis鎖
public void releaseRedisLock(Jedis redis,String params) {
redis.del(params);
}
// 在切換時(shí),需要先釋放舊的鎖
public void switchRedisLock(String oldParams, String newParams) {
// 釋放舊的Redis鎖
releaseRedisLock(oldParams);
//獲取新的Redis鎖
getRedisLock(newParams);
}
上面提供了實(shí)現(xiàn)Redis Lock的切換的過程,但是,實(shí)現(xiàn)該切換還存在一些其他的挑戰(zhàn)。首先是檢測舊的Lock在存活的時(shí)間,只有確認(rèn)舊的Lock的時(shí)間沒有超過設(shè)定的過期時(shí)間,新的Lock才能正常工作;Redis集群環(huán)境中節(jié)點(diǎn)之間的數(shù)據(jù)同步也是必須要滿足的條件,否則將可能導(dǎo)致節(jié)點(diǎn)之間數(shù)據(jù)不一致,進(jìn)而影響Redis Lock的使用。因此,實(shí)現(xiàn)Redis Lock的切換艱難而微妙,在進(jìn)行實(shí)現(xiàn)的過程中,既需要考慮Redis數(shù)據(jù)的完整性和一致性,又需要考慮Lock的安全性。
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗(yàn)。專業(yè)提供云主機(jī)、虛擬主機(jī)、域名注冊(cè)、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
網(wǎng)站題目:Redis鎖的艱難切換過程(redis鎖切換)
分享地址:http://m.5511xx.com/article/ccsgssg.html


咨詢
建站咨詢
