做網(wǎng)站用什么語言最好seo優(yōu)化設(shè)計(jì)
CommandLineRunner接口的run方法
什么是多級緩存?
多級緩存就是充分利用請求處理的每個環(huán)節(jié),分別添加緩存,減輕Server端的壓力,提升服務(wù)性能。
一級緩存:1.CDN:內(nèi)容分發(fā)網(wǎng)絡(luò)
二級緩存:2.NGINX+Lua腳本+OpenResty服務(wù)器 負(fù)載均衡反向代理【靜態(tài)和轉(zhuǎn)發(fā)】
三級緩存:JVM進(jìn)程緩存【本地緩存Caffeine】
四級緩存:Redis緩存
五級緩存:Mysql集群+主從復(fù)制
Mysql
現(xiàn)在是Caffeine===》(程序)====》Redis===》(cannel 阿里現(xiàn)成的工具 監(jiān)聽mysql)===》Mysql
那這個程序怎么實(shí)現(xiàn)對redis的監(jiān)聽?
沒有什么是加一層不能解決的【公共管理層】。
亮點(diǎn)+難點(diǎn)
1.自定義本地緩存初始化配置-咖啡因【CommandLineRunner】
2.自定義緩存控制器,用來制衡遠(yuǎn)程redis緩存和本地緩存localCacheCaffeine【這個就是所謂的公共管理層】
3.遠(yuǎn)程redis監(jiān)聽程序 健康度檢查
4.斷線重連
數(shù)據(jù)同步策略?
高可用+分布式數(shù)據(jù)最終一致性回答思路。
多種策略共存
1.設(shè)置有效期【緩存擊穿】
給緩存設(shè)置有效期,到期后自動刪除,再次查詢后更新。
對數(shù)據(jù)的即時性沒有嚴(yán)格要求的應(yīng)用場景,如一些只需要每天更新一次的報(bào)告數(shù)據(jù)。
優(yōu)點(diǎn):簡單方便
缺點(diǎn):時效性差,緩存過期之前可能不一致。
場景:更新頻率低,時效性要求低的場景
2.同步雙寫
在修改數(shù)據(jù)庫的同時,直接修改緩存
優(yōu)點(diǎn):時效性強(qiáng),緩存與數(shù)據(jù)庫強(qiáng)一致
缺點(diǎn):有代碼侵入,耦合度高
場景:對一致性、時效性要求較高的緩存數(shù)據(jù)
3.異步通知
修改數(shù)據(jù)庫時發(fā)送事件通知,相關(guān)服務(wù)監(jiān)聽到通知后修改緩存數(shù)據(jù)。
優(yōu)勢:低耦合,可以同時通知多個緩存服務(wù)
缺點(diǎn):時效性一半,可能存在中間不一致狀態(tài)
場景:時效性要求一般,有多個服務(wù)需要同步
1.基于MQ消息
2.基于Canal的通知
3.自己寫中間件
這個業(yè)務(wù)庫后面再加一層DTS,然后通過監(jiān)聽實(shí)時分發(fā)給下游消費(fèi),不然直接在業(yè)務(wù)庫監(jiān)聽,大批量物理操作或者敏感數(shù)據(jù)鏈路可以在新的DTS處理,這樣相當(dāng)于把業(yè)務(wù)徹底隔離開。
在數(shù)據(jù)庫和其他系統(tǒng)組件之間增加一個中間層來處理數(shù)據(jù)同步。這個中間層可以實(shí)時監(jiān)聽數(shù)據(jù)庫變更,并將這些變更分發(fā)給下游的消費(fèi)者(如緩存服務(wù))。這樣做的好處包括:
- 隔離業(yè)務(wù)邏輯和數(shù)據(jù)同步邏輯:保證業(yè)務(wù)數(shù)據(jù)庫的操作不受緩存同步邏輯的影響,以此提高業(yè)務(wù)數(shù)據(jù)庫的性能和穩(wěn)定性。
- 處理大批量操作:對于大批量的數(shù)據(jù)庫操作,可以在DTS層進(jìn)行處理,避免直接在業(yè)務(wù)數(shù)據(jù)庫上產(chǎn)生大量負(fù)載。
- 處理敏感數(shù)據(jù):對于敏感數(shù)據(jù),可以在DTS層進(jìn)行必要的數(shù)據(jù)篩選和脫敏處理,然后再分發(fā)到下游。
將業(yè)務(wù)邏輯和數(shù)據(jù)同步邏輯隔離開,可以讓系統(tǒng)的各個部分更加專注于它們自己的職責(zé),提高系統(tǒng)的可維護(hù)性和擴(kuò)展性。同時,這種架構(gòu)設(shè)計(jì)還可以增強(qiáng)系統(tǒng)對高并發(fā)和高可用性的支持。
背景
假設(shè)你有一個在線電商平臺,該平臺的用戶可以瀏覽商品、下訂單、寫評論等。這個平臺的后端使用一個MySQL數(shù)據(jù)庫來存儲所有的業(yè)務(wù)數(shù)據(jù),比如用戶信息、商品信息、訂單記錄等。
場景
隨著電商平臺的快速增長,你發(fā)現(xiàn)以下問題:
- 高峰時段,大量用戶下單導(dǎo)致數(shù)據(jù)庫寫入操作頻繁,影響了數(shù)據(jù)庫的性能。
- 你想實(shí)現(xiàn)一個實(shí)時推薦系統(tǒng),該系統(tǒng)需要基于用戶的最新交互數(shù)據(jù)來更新推薦內(nèi)容。
- 為了提升性能,你決定使用緩存服務(wù)來減少數(shù)據(jù)庫的讀取壓力。
問題
直接在業(yè)務(wù)數(shù)據(jù)庫上實(shí)現(xiàn)這些功能會有以下問題:
- 數(shù)據(jù)庫可能會因?yàn)樘幚泶罅康耐健⒆x寫操作而成為性能瓶頸。
- 如果直接在業(yè)務(wù)庫上監(jiān)聽數(shù)據(jù)變更,任何監(jiān)聽過程中的延遲或錯誤都可能直接影響到主業(yè)務(wù)的穩(wěn)定性和性能。
DTS層的引入
為了解決上述問題,你決定引入一個DTS層;這個DTS層可以理解為一個中間件或服務(wù)平臺,它的角色如下:
- 數(shù)據(jù)同步:DTS層監(jiān)聽業(yè)務(wù)數(shù)據(jù)庫的變更(例如使用Binlog監(jiān)聽MySQL的變更)。當(dāng)有新的訂單產(chǎn)生時,DTS層捕獲這個變更事件。
- 數(shù)據(jù)分發(fā):DTS層將捕獲的事件發(fā)送給其他感興趣的系統(tǒng)或服務(wù),比如緩存更新服務(wù)、搜索索引服務(wù)、實(shí)時推薦系統(tǒng)等。
- 數(shù)據(jù)處理:在分發(fā)之前,DTS層可以對數(shù)據(jù)進(jìn)行必要的加工處理,例如數(shù)據(jù)清洗、轉(zhuǎn)換格式、脫敏等。
例子
- 訂單服務(wù):當(dāng)用戶下單時,訂單服務(wù)將訂單信息寫入數(shù)據(jù)庫。
- DTS層捕獲變更:DTS層監(jiān)聽到訂單表有新的記錄,它捕獲了這個變更事件。
- 實(shí)時推薦系統(tǒng)更新:DTS層將訂單信息發(fā)送給實(shí)時推薦系統(tǒng),該系統(tǒng)根據(jù)新的訂單更新用戶的推薦列表。
- 緩存服務(wù)同步:DTS層同時通知緩存服務(wù),讓其更新相關(guān)的用戶信息緩存,以確保其他用戶看到的是最新的訂單信息。
好處
- 業(yè)務(wù)邏輯與數(shù)據(jù)同步解耦:業(yè)務(wù)數(shù)據(jù)庫只需關(guān)注數(shù)據(jù)的存儲和業(yè)務(wù)邏輯處理,而DTS層負(fù)責(zé)數(shù)據(jù)的同步和分發(fā),避免了直接在業(yè)務(wù)庫上額外增加處理負(fù)擔(dān)。
- 提高性能:DTS層可以批量處理和優(yōu)化數(shù)據(jù)同步過程,減輕業(yè)務(wù)數(shù)據(jù)庫的壓力。
- 增強(qiáng)安全性和隱私:DTS層可以對敏感數(shù)據(jù)進(jìn)行脫敏處理,確保在傳輸過程中不泄露用戶隱私。
- 靈活性:可以根據(jù)需要為不同的下游系統(tǒng)定制數(shù)據(jù)分發(fā)和處理邏輯。
通過引入DTS層,電商平臺的架構(gòu)變得更加健壯和可擴(kuò)展,能夠更好地應(yīng)對高并發(fā)場景,并為用戶提供更加快速和個性化的服務(wù)。
設(shè)計(jì)多級緩存【如果redis數(shù)據(jù)量特別大 就不適合咖啡因了】
我們將進(jìn)程內(nèi)緩存與分布式緩存服務(wù),結(jié)合有效分?jǐn)倯?yīng)用壓力。在java應(yīng)用層面,只有本地緩存Caffeine的緩存不存在時,再去redis分布式緩存獲取,如果Redis也沒有此數(shù)據(jù)再去數(shù)據(jù)庫查詢。數(shù)據(jù)查詢成功后,對redis與Caffeine同時進(jìn)行雙寫更新。這樣java應(yīng)用下一次再查詢相同數(shù)據(jù)時,直接從本地Caffeine緩存獲取,不再產(chǎn)生新的網(wǎng)絡(luò)通信,應(yīng)用查詢性能得到顯著提高。
1.先調(diào)用set