Redis快取和資料庫一致性解決策略
阿新 • • 發佈:2019-12-31
一、 實時同步
- 要求強一致性
- 先查詢緩,若存查詢不到,再查DB,然後儲存到快取
- 更新快取時,先更新資料庫,再將快取的設定過期(建議不要去更新快取內容,直接設定快取過期)
二、 非同步佇列
簡介
對於併發程度較高的,可採用非同步佇列的方式同步資料,可採用kafka、RicketMQ等訊息中介軟體處理訊息生產和消費
kafka優點
- 資料放在了硬碟上,對硬碟進行了順序IO流存址,所以讀取效率高
kafka作用
- 非同步資料同步
- 流量削峰:如同時給1W人打款,伺服器壓力大,可進行非同步操作,設定非同步佇列,然後定時,在伺服器空閒的時候一個一個進行打款操作
- 資料放在硬碟上,而不是記憶體中,保證訊息佇列的資料不丟失
三、 阿里的同步工具canal
簡介
canal實現方式是模擬mysql slave和master的同步機制,監控DB bitlog的日誌更新來觸發快取的更新,此種方法可以解放程式設計師雙手,減少工作量,但在使用時有些侷限性。
Mysql主從複製原理簡析
- 該模型有兩種伺服器:例如,master伺服器專門用於資料的增刪改,slave伺服器(1個或多個)專門用於資料查詢
- 如何保證兩種伺服器資料的一致性?
- master伺服器將操作中的改變記錄存放到二進位制日誌檔案中(binary log),這些記錄叫做二進位制日誌事件(binary log events),我們可以通過show binlog events命令進行檢視。
- Slave伺服器會通過IO執行緒去讀取binary log檔案中資訊並複製到自己的relay log(中繼日誌)日誌檔案中。
- Slave伺服器在通過開啟SQL執行緒定時讀取檢查relay log,一旦發現有修改,就立即重新載入relay log檔案中的資訊,然後執行檔案中的修改記錄,並反映到自己的伺服器中。
canal原理簡析
- canal模擬mysql slave的互動協議,偽裝自己為mysql slave,向mysql master傳送dump協議
- mysql master收到dump請求,開始推送binary log給slave(也就是canal)
- canal解析binary log物件
四、 用UDF自定義函式的方式
面對mysql的API進行程式設計,利用觸發器進行快取同步,但UDF主要是c/c++語言實現,學習成本高。
PS:
- 文章來自各種資源的整理,如有侵權請告知刪除。
- 轉載本文請註明出處