數(shù)據(jù)庫redis使用教程 怎么實現(xiàn)redis和數(shù)據(jù)庫的同步?
怎么實現(xiàn)redis和數(shù)據(jù)庫的同步?1.讀取數(shù)據(jù)時,先從r不用數(shù)據(jù)庫直接用redis可以嗎?你當(dāng)然需要它。。。Rredis和數(shù)據(jù)庫如何保證一致性?1.不一致的原因是什么?在使用redis的過程中,我們通
怎么實現(xiàn)redis和數(shù)據(jù)庫的同步?
1.讀取數(shù)據(jù)時,先從r
不用數(shù)據(jù)庫直接用redis可以嗎?
你當(dāng)然需要它。。。R
redis和數(shù)據(jù)庫如何保證一致性?
1.不一致的原因是什么?
在使用redis的過程中,我們通常是這樣做的,先讀取緩存,如果緩存不存在,再讀取數(shù)據(jù)庫。
是否先寫庫再刪除緩存;或者先刪除緩存再寫入庫,可能會出現(xiàn)數(shù)據(jù)不一致的情況。
因為寫和讀是并發(fā)的,所以沒有辦法保證順序。如果在寫入庫之前刪除了緩存,另一個線程將會讀取它。如果緩存為空,它將從數(shù)據(jù)庫中讀取數(shù)據(jù)并將其寫入緩存。此時,緩存是臟的。如果先寫庫,在刪除緩存之前,寫庫的線程就宕機了,如果不刪除緩存,也會出現(xiàn)數(shù)據(jù)不一致的情況。
如果是redis集群,或者主從模式,寫主讀從,因為redis復(fù)制有一定的時間延遲,也可能導(dǎo)致數(shù)據(jù)不一致。
2.優(yōu)化想法
(read操作優(yōu)先讀取redis,如果沒有 t exist,訪問MySql,將讀取的數(shù)據(jù)寫回Redis
(2)如果是寫操作,直接寫MySql,成功后再寫Redis,替換原來的舊數(shù)據(jù)(可以在MySql定義一個CRUD觸發(fā)器,觸發(fā)CRUD操作后將數(shù)據(jù)寫到Redis,或者在Redis解析binlog,再做相應(yīng)的操作)。
(3)設(shè)置合理的超時,即超時后自動刪除redis中相應(yīng)的數(shù)據(jù)。最壞的情況是在超時期間內(nèi)存中存在不一致。當(dāng)然,這種策略考慮到了redis和主從數(shù)據(jù)庫之間耗時的同步,所以最好在第二次刪除之前休眠一定時間,比如500毫秒,這無疑增加了耗時的寫請求。