一.實時同步
對強一致性要求比較高的,應採用實時同步方案,即查詢緩存查詢不到再去從DB查詢,更新緩存的時先更新數據庫,再將緩存的設置過期。
@Cacheable :查詢時使用,注意long類型需要轉換爲string類型,否則會拋異常
@CachePut: 更新時使用,使用次註解,一定會從DB中查詢數據
@CacheEvict :刪除時使用,
@Caching:組合使用
非實時同步:
一方修改,另一方補血藥同步修改
1個文章 1分鐘內被點擊1000萬次(點擊數1000萬)
定時任務(凌晨2點觸發定時任務):將redis中得redis num查詢出來更新到mysql中
redis incr num
musql num = 0;
二.異步隊列
併發量很高的話,可以採用異步隊列的方式同步,可採用kafka等消息中間件處理消息生產和消費
activemq rabbitmq zeromq rockermq kafka
Kafka:免費,性能很高
性能高,但是是在硬盤上
rockermq:優點是消息的可靠性高(0丟失),功能強大,價格昂貴
rabbitmq:apache
三.使用阿里的同步工具canal
canal的實現方式是模擬musql slave 和master 的同步機制,監控DB bitlog的日誌更新來觸發緩存的更新,此種方法可以解放程序員的雙手,減少工作量,但在使用的時候有侷限性
canal的工作原理
- 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++語言實現,學習成本高