新聞中心
Redis臟讀是指在并發(fā)訪問Redis時,可能會發(fā)生的情況,也就是一個客戶端在數(shù)據(jù)正在被另一個客戶端修改時讀取到了另一個客戶端未更新的舊值。臟讀的具體原理其實比較復(fù)雜,下面讓我們一起看看Redis臟讀背后的原理。

創(chuàng)新互聯(lián)主營盈江網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,重慶APP開發(fā),盈江h(huán)5重慶小程序開發(fā)搭建,盈江網(wǎng)站營銷推廣歡迎盈江等地區(qū)企業(yè)咨詢
首先要知道Redis運(yùn)行原理,Redis是以內(nèi)存為主,而實現(xiàn)高性能有兩種方法:單線程模式和多線程模式。Redis采用單線程模式來操作,它會以一個線程來為所有客戶端連接服務(wù),這極大降低了開銷。單線程模式會積極使用緩存,減少數(shù)據(jù)訪問時的磁盤I/O次數(shù),也就是說只有在修改數(shù)據(jù)的時候才會進(jìn)行同步,而不是每次訪問都要進(jìn)行數(shù)據(jù)的統(tǒng)一。
而導(dǎo)致臟讀的原因是由于這種單線程的機(jī)制 —— 同時修改數(shù)據(jù)的情況下,先改的用戶先能看到改之前的數(shù)據(jù),而后改的用戶只能看到修改后的數(shù)據(jù),這就會產(chǎn)生臟讀。下圖可以生動地展示這個過程:

從上圖可以得出,第一次訪問時,用戶A正好讀取到臟數(shù)據(jù)(5),而用戶B在之后讀取數(shù)據(jù)更加正常(10)。由于在寫入數(shù)據(jù)的時候,用戶B操作被Redis中斷,導(dǎo)致用戶A在之前的數(shù)據(jù)上進(jìn)行讀取,從而發(fā)生了臟讀的狀態(tài)。
綜上所述,Redis臟讀背后的原理就是多個客戶端同時操作Redis時,一個客戶端讀取另一個客戶端修改前的舊值,從而導(dǎo)致出現(xiàn)臟數(shù)據(jù)。如果要有效避免臟讀,那么可以通過分布式鎖或者數(shù)據(jù)持久化等方式來降低臟讀的概率。
“`javascript
// 進(jìn)行Redis的操作之前,加入一個分布式鎖
const acquireLock = client.setAsync(‘lock’, ‘rand’, ‘NX’, ‘EX’, 10);
if(acquireLock) {
// do something with redis
}
// 操作完畢,釋放鎖
client.del(‘lock’);
成都創(chuàng)新互聯(lián)建站主營:成都網(wǎng)站建設(shè)、網(wǎng)站維護(hù)、網(wǎng)站改版的網(wǎng)站建設(shè)公司,提供成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、成都網(wǎng)站推廣、成都網(wǎng)站優(yōu)化seo、響應(yīng)式移動網(wǎng)站開發(fā)制作等網(wǎng)站服務(wù)。
當(dāng)前題目:解析Redis臟讀背后的原理(對redis臟讀)
轉(zhuǎn)載注明:http://fisionsoft.com.cn/article/dhdhdge.html


咨詢
建站咨詢
