1. 程式人生 > 其它 >Redis與Mysql資料一致性的解決?

Redis與Mysql資料一致性的解決?

1、命中:程式先從快取中讀取資料,如果命中直接返回。

2、失效:程式先從快取中讀取資料,如果沒有命中,則從資料庫中讀取,成功之後將資料放入快取。

3、更新:程式先更新資料庫,再刪除快取。

更新:

  1、先更新快取,再更新資料庫

  2、先更新資料庫,再更新快取(執行緒A更新了資料庫 count=1,執行緒B搶佔到了CPU資源更新資料庫count=2,再更新快取count=2,這個時候執行緒A再次獲取到CPU資源做最後的更新,將快取中的資料更新為1。這樣就會導致資料庫與快取資料不一致的情況)

  3、先刪除快取,再更新資料庫(執行緒A刪除快取count=1,執行緒B訪問count沒拿到快取,發現不存,從資料庫讀取到舊值count=1,執行緒A更新資料庫為2,執行緒B將資料寫入到快取中為1)。

  4、先更新資料庫,再刪除快取(概率很小,出問題:先前快取剛好失效,請求A查資料庫得到舊值count=1,請求B更新資料庫,查詢到資料中count=2,請求B刪除快取,請求A寫入快取A=1)。

  第4個可以搭配延遲刪除來解決問題。 請求B更新資料庫以後,讓執行緒睡一段時間過後,再刪除快取。

Mysql讀寫分離(主從架構模式)

  

 canal訂閱mysql的binlog日誌,將主mysql的最新資料實時覆蓋redis原始的值。

高可用的話,就引入訊息佇列。