新聞中心
redis和數(shù)據(jù)庫(kù)如何保證一致性?
1、不一致產(chǎn)生的原因?

我們?cè)谑鞘褂胷edis過(guò)程中,通常會(huì)這樣做,先讀取緩存,如果緩存不存在,則讀取數(shù)據(jù)庫(kù)。
不管是先寫(xiě)庫(kù),再刪除緩存;還是先刪除緩存,再寫(xiě)庫(kù),都有可能出現(xiàn)數(shù)據(jù)不一致的情況。
因?yàn)閷?xiě)和讀是并發(fā)的,沒(méi)法保證順序,如果刪除了緩存,還沒(méi)有來(lái)得及寫(xiě)庫(kù),另一個(gè)線程就來(lái)讀取,發(fā)現(xiàn)緩存為空,則去數(shù)據(jù)庫(kù)中讀取數(shù)據(jù)寫(xiě)入緩存,此時(shí)緩存中為臟數(shù)據(jù)。如果先寫(xiě)了庫(kù),在刪除緩存前,寫(xiě)庫(kù)的線程宕機(jī)了,沒(méi)有刪除掉緩存,則也會(huì)出現(xiàn)數(shù)據(jù)不一致情況。
如果是redis集群,或者主從模式,寫(xiě)主讀從,由于redis復(fù)制存在一定的時(shí)間延遲,也有可能導(dǎo)致數(shù)據(jù)不一致。
2、優(yōu)化思路
(1)讀操作優(yōu)先讀取redis,不存在的話就去訪問(wèn)MySql,并把讀到的數(shù)據(jù)寫(xiě)回Redis中;
(2)寫(xiě)操作的話,直接寫(xiě)MySql,成功后再寫(xiě)入Redis,替換掉原來(lái)的舊數(shù)據(jù)(可以在MySql端定義CRUD觸發(fā)器,在觸發(fā)CRUD操作后寫(xiě)數(shù)據(jù)到Redis,也可以在Redis端解析binlog,再做相應(yīng)的操作)
(3)設(shè)定合理的超時(shí)時(shí)間,即經(jīng)過(guò)超時(shí)時(shí)間,自動(dòng)將redis中相應(yīng)的數(shù)據(jù)刪除。這樣最差的情況是在超時(shí)時(shí)間內(nèi),內(nèi)存存在不一致。當(dāng)然這種策略要考慮redis和數(shù)據(jù)庫(kù)主從同步的耗時(shí),所以在第二次刪除前最好休眠一定的時(shí)間,比如500毫秒,這樣無(wú)疑又增加了寫(xiě)請(qǐng)求的耗時(shí)。
到此,以上就是小編對(duì)于如何判斷redis取到是否為空值的問(wèn)題就介紹到這了,希望這1點(diǎn)解答對(duì)大家有用。
文章標(biāo)題:如何判斷redis取到是否為空
網(wǎng)頁(yè)鏈接:http://www.dlmjj.cn/article/dpocgip.html


咨詢
建站咨詢
