以redis與數據庫緩存一致性爲例
redis緩存與數據庫一致性
簡單介紹解決方案
一、實時同步
對強一致要求比較高的,應採用實時同步方案,即查詢緩存查詢不到再從DB查詢,保存到緩存;更新緩存時,先更新數據庫,再將緩存的設置過期(建議不要去更新緩存內容,直接設置緩存過期)。
@Cacheable:查詢時使用,注意Long類型需轉換爲Sting類型,否則會拋異常
@CachePut:更新時使用,使用此註解,一定會從DB上查詢數據
@CacheEvict:刪除時使用;
@Caching:組合用法
二、異步隊列
對於併發程度較高的,可採用異步隊列的方式同步,可採用kafka等消息中間件處理消息生產和消費。
三、使用阿里的同步工具canal
canal實現方式是模擬mysql slave和master的同步機制,監控DB bitlog的日誌更新來觸發緩存的更新,此種方法可以解放程序員雙手,減少工作量,但在使用時有些侷限性。
一節課解密阿里巴巴Canal
- master將改變記錄到二進制日誌(binary log)中(這些記錄叫做二進制日誌事件,binary log events,可以通過show binlog events進行查看);
- slave將master的binary log events拷貝到它的中繼日誌(relay log);
- slave重做中繼日誌中的事件,將改變反映它自己的數據。
- canal模擬mysql slave的交互協議,僞裝自己爲mysql slave,向mysql master發送dump協議
- mysql master收到dump請求,開始推送binary log給slave(也就是canal)
- canal解析binary log對象(原始爲byte流)
四、採用UDF自定義函數的方式
面對mysql的API進行編程,利用觸發器進行緩存同步,但UDF主要是c/c++語言實現,學習成本高。
UDF自定義函數就是數據庫的觸發器,他是與表事件相關的特殊存儲過程當數據庫表有事件發生就會觸發某些函數的操作。