讀寫分離怎么實(shí)現(xiàn) redis需要讀寫分離嗎?
redis需要讀寫分離嗎?首先,結(jié)論是:這與您的特定體系結(jié)構(gòu)實(shí)現(xiàn)和業(yè)務(wù)有關(guān)。在常見的應(yīng)用場(chǎng)景中,我認(rèn)為沒有必要在redis中分離讀寫。首先,我們來討論為什么讀寫分離是必要的:;讀寫分離用于大量的讀請(qǐng)求
redis需要讀寫分離嗎?
首先,結(jié)論是:這與您的特定體系結(jié)構(gòu)實(shí)現(xiàn)和業(yè)務(wù)有關(guān)。在常見的應(yīng)用場(chǎng)景中,我認(rèn)為沒有必要在redis中分離讀寫。首先,我們來討論為什么讀寫分離是必要的:;讀寫分離用于大量的讀請(qǐng)求,它通過多個(gè)從機(jī)分配讀壓力,從而提高讀性能。選擇太多會(huì)阻塞數(shù)據(jù)庫(kù),使您無法添加、刪除和修改,當(dāng)并發(fā)性太大時(shí),數(shù)據(jù)庫(kù)將被拒絕。因此,使用讀寫分離來提高性能和避免拒絕服務(wù)。在我看來,需要讀寫分離的應(yīng)用場(chǎng)景是:寫請(qǐng)求在可接受的范圍內(nèi),但讀請(qǐng)求比寫請(qǐng)求大得多。然后討論了redis常用的應(yīng)用場(chǎng)景:cache。排名應(yīng)用,訪問計(jì)數(shù)應(yīng)用。實(shí)時(shí)消息系統(tǒng);首先,我們討論cache集群,這也是一個(gè)非常常見的應(yīng)用場(chǎng)景:cache主要解決用戶訪問時(shí)如何更快地獲取數(shù)據(jù)。單個(gè)機(jī)器的內(nèi)存資源非常有限,因此緩存集群會(huì)通過某種算法將不同的數(shù)據(jù)放入不同的機(jī)器。對(duì)于不同的持久化數(shù)據(jù)庫(kù),一般來說,內(nèi)存數(shù)據(jù)庫(kù)單機(jī)版可以支持大量的添加、刪除、查詢和修改。如果機(jī)器不能支持,可以通過主從復(fù)制和緩存來解決。綜上所述,在這種情況下,應(yīng)用redis進(jìn)行讀寫分離完全失去了讀寫分離的意義。
DB讀寫分離情況下,如何解決緩存和數(shù)據(jù)庫(kù)不一致性問題?
有兩種選擇。
讓我們首先了解緩存和數(shù)據(jù)庫(kù)數(shù)據(jù)不一致時(shí)會(huì)發(fā)生什么。查詢數(shù)據(jù)時(shí),優(yōu)先從緩存中獲取數(shù)據(jù)。如果緩存不存在,則查詢數(shù)據(jù)庫(kù)并寫入緩存。如果數(shù)據(jù)庫(kù)數(shù)據(jù)發(fā)生更改,請(qǐng)清除緩存。在正常情況下,沒有問題。但是,在服務(wù)的并發(fā)性非常高的情況下,如果刪除緩存,則在數(shù)據(jù)庫(kù)完成數(shù)據(jù)更新之前會(huì)有查詢請(qǐng)求。此時(shí),舊數(shù)據(jù)將被讀寫到緩存中。在這種情況下,緩存和數(shù)據(jù)庫(kù)不一致。
第一種解決方案:延遲刪除。更改數(shù)據(jù)庫(kù)數(shù)據(jù)時(shí),清除緩存的操作會(huì)延遲一段時(shí)間。這段時(shí)間可能很短。它只需要確保數(shù)據(jù)庫(kù)寫入操作已完成。但在實(shí)際環(huán)境中,我們不知道數(shù)據(jù)庫(kù)何時(shí)會(huì)寫入數(shù)據(jù),所以很難控制這段時(shí)間。如果太短,就不行了。如果時(shí)間太長(zhǎng),會(huì)影響體驗(yàn)。但總的來說,這種方法可以解決問題。
另一種解決方案是使用數(shù)據(jù)庫(kù)的binlog來訂閱binlog。更新數(shù)據(jù)時(shí),該消息用于通知?jiǎng)h除緩存。該方案能保證數(shù)據(jù)庫(kù)更新操作的完成和緩存的及時(shí)更新。