新聞中心
Redis臟讀是一種指當(dāng)多個(gè)事務(wù)同時(shí)從Redis的數(shù)據(jù)庫中讀取數(shù)據(jù)的情況下,某個(gè)事務(wù)讀取到的數(shù)據(jù)是其他事務(wù)提交的,而沒有被提交事務(wù)執(zhí)行修改過的。 Redis臟讀會(huì)導(dǎo)致系統(tǒng)數(shù)據(jù)不一致,甚至出現(xiàn)無法預(yù)料的異常。

當(dāng)使用Redis數(shù)據(jù)庫時(shí),我們必須確保Redis臟讀不會(huì)帶來問題。最佳實(shí)踐是使用可重復(fù)讀事務(wù)(RR)。RR事務(wù)提供了一種在重復(fù)讀取上保持?jǐn)?shù)據(jù)一致性的機(jī)制,即在進(jìn)行兩次讀取之間,不允許任何更新操作。
但是,當(dāng)執(zhí)行RR事務(wù)時(shí),我們必須小心避免死鎖的發(fā)生。對(duì)于任意兩個(gè)事務(wù)A和B,兩個(gè)事務(wù)都不會(huì)被阻塞,直到所有樂觀鎖被釋放,所有更新事務(wù)也被提交為止。為了保證避免死鎖發(fā)生,我們可以使用最佳實(shí)踐:在執(zhí)行RR事務(wù)時(shí),維持活鎖,即確保修改需要被寫入到Redis中。
舉個(gè)例子,當(dāng)我們請(qǐng)求Redis內(nèi)的某個(gè)對(duì)象存儲(chǔ)的值的時(shí)候,使用活鎖可以確保獲得的值為其他事務(wù)提交的值,而不是其他事務(wù)執(zhí)行的而沒有被提交的修改值。 實(shí)現(xiàn)活鎖的方法相對(duì)簡(jiǎn)單:使用Redis的SETNX函數(shù)即可,使用SETNX函數(shù)可以將一個(gè)新的唯一的ID寫入到Redis中。
例如:
int lockTimeOutMillis = 15000;
String prefix = "lock:";
// Get a lock:
String lockName = prefix + thekey;
String lockTime = String.valueOf(System.currentTimeMillis() + lockTimeOutMillis);
if (jedisClient.setnx(lockName, lockTime) == 1) {
// lock obtned
// run protected code
// release lock
...
}
當(dāng)同時(shí)訪問Redis數(shù)據(jù)庫時(shí),我們可以使用RR事務(wù)來保持?jǐn)?shù)據(jù)一致性,避免Redis臟讀問題。同時(shí),我們還需要使用活鎖來確保數(shù)據(jù)一致性,保證我們讀取Redis中的值都是最新寫入的,防止Redis臟讀的發(fā)生。
香港服務(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ù)器等。
分享標(biāo)題:的考慮考慮Redis臟讀看看什么才是最佳實(shí)踐(對(duì)redis臟讀)
標(biāo)題網(wǎng)址:http://m.fisionsoft.com.cn/article/dhsesgj.html


咨詢
建站咨詢
