新聞中心
Redis是當(dāng)下最受歡迎的內(nèi)存數(shù)據(jù)庫(kù),其高性能、持續(xù)時(shí)間長(zhǎng)占據(jù)重要地位。Redis支持豐富的數(shù)據(jù)類型,當(dāng)事務(wù)處理復(fù)雜任務(wù)時(shí)其作用尤為明顯,特別是在多線程環(huán)境下,為了防止各個(gè)線程之間的并發(fā)沖突,無(wú)疑需要一個(gè)強(qiáng)大的機(jī)制來(lái)實(shí)現(xiàn)有效的并發(fā)控制。于是,Redis鎖機(jī)制進(jìn)入討論。

創(chuàng)新互聯(lián)2013年至今,先為延平等服務(wù)建站,延平等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為延平企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。
Redis鎖機(jī)制為基于原子性,底層使用SETNX命令+EXPIRE達(dá)到鎖的實(shí)現(xiàn),代碼實(shí)現(xiàn)如下:
// 獲取鎖的函數(shù)
public static boolean tryGetDistributedLock(Jedis jedis, string lockKey, String requestId, int expireTime) {
// SETNX成功,則獲取鎖成功
String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);
if ("OK".equals(result)) {
return true;
}
return false;
}
// 釋放鎖的函數(shù)
public static boolean releaseDistributedLock(Jedis jedis, String lockKey, String requestId){
// 首先獲取鎖對(duì)應(yīng)的value值,檢查是否與requestId相等
// 由于這種方式是WATCH+GETSET+MULTI,因此只有requestId擁有鎖的請(qǐng)求才能修改lockKey
String value = jedis.get(lockKey);
if (StringUtils.isNotEmpty(value) && value.equals(requestId)) {
jedis.del(lockKey);
return true;
}
return false;
}
Redis鎖機(jī)制與傳統(tǒng)的系統(tǒng)鎖有一定差異,Redis是獨(dú)立的服務(wù)器,而且占用計(jì)算資源等較低,在多服務(wù)器服務(wù)器環(huán)境下,不論任何一臺(tái)服務(wù)器上都可以建立相同的Redis鎖,使得服務(wù)器之間的互斥性更加高效。但是,由于網(wǎng)絡(luò)的不穩(wěn)定性,可能在建立鎖的過(guò)程中發(fā)生網(wǎng)絡(luò)故障,比如請(qǐng)求發(fā)出但未收到響應(yīng)——丟失包現(xiàn)象,導(dǎo)致鎖被未知狀態(tài)。因此,建議用戶在真正應(yīng)用場(chǎng)景中,配合心跳機(jī)制結(jié)合實(shí)現(xiàn),以盡量避免鎖被未知情況搶占。
Redis鎖機(jī)制無(wú)疑給許多復(fù)雜的事務(wù)處理任務(wù)提供了非常有效的解決方案,使得互相獨(dú)立的線程之間能夠有效的避免沖突,但也許用戶需要在具體的應(yīng)用場(chǎng)景中結(jié)合心跳機(jī)制加以完善。
創(chuàng)新互聯(lián)服務(wù)器托管擁有成都T3+級(jí)標(biāo)準(zhǔn)機(jī)房資源,具備完善的安防設(shè)施、三線及BGP網(wǎng)絡(luò)接入帶寬達(dá)10T,機(jī)柜接入千兆交換機(jī),能夠有效保證服務(wù)器托管業(yè)務(wù)安全、可靠、穩(wěn)定、高效運(yùn)行;創(chuàng)新互聯(lián)專注于成都服務(wù)器托管租用十余年,得到成都等地區(qū)行業(yè)客戶的一致認(rèn)可。
網(wǎng)站欄目:Redis鎖機(jī)制實(shí)現(xiàn)有效的并發(fā)控制(redis鎖機(jī)制控制并發(fā))
網(wǎng)站路徑:http://fisionsoft.com.cn/article/djieoch.html


咨詢
建站咨詢
