查詢mysql超時sql,redis和數據庫如何保證一致性?1、不一致產生的原因?
我們在是使用redis過程中,通常會這樣做,先讀取緩存,如果緩存不存在,則讀取數據庫。
不管是先寫庫,再刪除緩存;還是先刪除緩存,再寫庫,都有可能出現數據不一致的情況。
因為寫和讀是并發的,沒法保證順序,如果刪除了緩存,還沒有來得及寫庫,另一個線程就來讀取,發現緩存為空,則去數據庫中讀取數據寫入緩存,此時緩存中為臟數據。如果先寫了庫,在刪除緩存前,寫庫的線程宕機了,沒有刪除掉緩存,則也會出現數據不一致情況。
如果是redis集群,或者主從模式,寫主讀從,由于redis復制存在一定的時間延遲,也有可能導致數據不一致。
2、優化思路
(1)讀操作優先讀取redis,不存在的話就去訪問MySql,并把讀到的數據寫回Redis中;
(2)寫操作的話,直接寫MySql,成功后再寫入Redis,替換掉原來的舊數據(可以在MySql端定義CRUD觸發器,在觸發CRUD操作后寫數據到Redis,也可以在Redis端解析binlog,再做相應的操作)
(3)設定合理的超時時間,即經過超時時間,自動將redis中相應的數據刪除。這樣最差的情況是在超時時間內,內存存在不一致。當然這種策略要考慮redis和數據庫主從同步的耗時,所以在第二次刪除前最好休眠一定的時間,比如500毫秒,這樣無疑又增加了寫請求的耗時。