MySQL和mq一致性,Mysql与Redis一致性问题
緩存一致性產生背景
如果每次頻繁的訪問數據庫的時候,雖然查詢底層使用B+樹索引 但還會做磁盤的IO操作,可能會對數據庫的壓力非常大。
所以為了能夠減輕數據庫的訪問壓力,會使用一些緩存實現減輕數據庫的壓力。
比如 Redis、es、ehcache、oscache等。
多級緩存架構設計
首先在jvm內置緩存ehcache、oscache底層基于HashMap實現 ,如果服務集群的情況下數據同步采用rmi實現性能可能不是很好。
補充:rmi就是 jvm與jvm之間通訊
設計模式采用裝飾模式。
Mysql與Redis緩存一致性原理
Mysql與nosql之間數據一致性問題:
Mysql與redis/es/mongdb 都是相同的。
(相同key)
第一次查詢:
1. 查詢二級緩存Redis,redis如果沒有該緩存數據,則開始查詢mysql;
2. 在查詢mysql,如果mysql中存在數據的情況下,就將該數據緩存到Redis中
第二次查詢:
1. 查詢到redis中如果存在該數據的情況下,則不會查詢mysql。
能夠減輕數據庫訪問壓力。
重點解決方案:
1. 對mysql增量做寫的操作的時候,都會同步到Redis。
如果insetdb ,insetredis
如果update ,將redis中該key刪除。---懶加載。
如果update ,直接修改redis。---增量同步。
如果delete ,將redis中該key刪除。---增量同步。
如果數據庫數據發生變化,如何同步給Redis
1. 直接清除Redis緩存;(適合于小項目)基于接口形式實現同步
2. 基于MQ形式異步同步 (適合于中小項目)基于接口形式實現同步
3. 基于canal+mq異步同步 (推薦)基于源頭binlog二進制文件實現同步。
基于canal同步的原理:
1. Canal服務器端偽裝成一個mysql從節點,訂閱mysql主節點的binlog二進制文件
2. Canal服務器端收到binlog文件,就會轉換成json的格式發送給Canal客戶端。
3. Canal客戶端會將該數據同步給nosql緩存 redis
流程:
第一次請求流程:
1. 先請求查詢redis緩存,如果redis緩存沒有數據則查詢mysql數據庫,如果mysql數據庫存在數據,則將該數據緩存到Redis中。
第一次請求流程:
2. 先請求查詢Redis緩存,如果redis緩存存在數據的話,則不會查詢mysql數據
從而實現減輕數據庫訪問壓力。
優化:Canal接收到mysqlbinlog文件,將該消息緩存到kafka中,再開啟多個消費者
異步地獲取消息同步到Redis中,能夠提高同步的效率。
如果數據庫數據發生變化,如何同步給Redis
方案1:直接刪除Redis緩存;
方案2: 基于MQ異步同步更新
方案3: 基于canal訂閱binlog同步
http://127.0.0.1:8081/insert?name=mayikt&age=22
http://127.0.0.1:8081/getUser?id=6
http://127.0.0.1:8081/updateUser?userId=9&name=meite6666
基于canal訂閱binlog同步 實現原理
1. canal服務器模擬偽裝成mysql從節點,訂閱mysql 主節點的binlog文件;
2. 當mysql主節點binlog文件發生變化的時候,會通知給canal服務器端;
3. Canal服務器端在將該binlog文件轉換為json格式數據發送給canal客戶端監聽者。
4. canal客戶端,在將該數據異步寫入到redis中;
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的MySQL和mq一致性,Mysql与Redis一致性问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小米信号差?中国电信:Wi-Fi性能小米
- 下一篇: oracle trace发起用户,Ora