一、理解快取
以空間換時間,所有儲存“中間的、額外的”資料的機制,都可以稱之為快取。
二、快取的作用
通過以下兩點,對系統效能有提升
(1)縮短時間,有些資料可能查詢起來或是運算起來很花時間, 那麼我們就可以在某次獲取該資料後放在可以快速取回的地方。
(2)降低壓力,在高併發的情況下可能會導致資料庫壓力過大,藉助資料快取可以很好的規避這種問題。
三、快取的合理性
(1)訪問頻率是高還是低?
如果訪問頻率低,快取帶來的業務複雜度弊端會高於系統效能提高的優勢;所以訪問頻率高,適合快取,而且效果也好些;
(2) 讀寫比例是什麼樣的?
訪問頻率高,讀多寫少,適合快取,效果會好
(3)資料一致性要求高嗎?
使用快取適用那些對資料一致性要求不高的業務。
四、快取的進化
(1)業務開始時,使用關係型資料庫
(2)使用者量上來後,將資料庫改為讀寫分離的架構。
(3)還是撐不住,增加資料快取層(redis)
(4)進一步優化,再次增加快取層,形成多級快取
(5)通過增加快取監控,確保快取的有效性,以及進一步優化快取的策略等
五、快取常見問題
下面所說的三種問題快取方案都類似於Redis+Mysql,首先先從快取中獲取資料,找不到的時候去資料庫獲取資料並更新到快取中。
(1)快取穿透
請求去查詢一條壓根兒資料庫中根本就不存在的資料,也就是快取和資料庫都查詢不到這條資料,但是請求每次都會打到資料庫上面去。
解決方案:
1.對於返回為NULL的依然快取
2.制定一些規則過濾一些不可能存在的資料
(2)快取擊穿
在平常高併發的系統中,大量的請求同時查詢一個 key 時,此時這個key正好失效了,就會導致大量的請求都打到資料庫上面去。這種現象我們稱為快取擊穿。
解決方案:
1.加分散式鎖,對於獲取到這個鎖的執行緒,查詢資料庫更新快取,其他執行緒採取重試策略
2.採取到期自動重新整理的策略,而不是到期自動淘汰
(3)快取雪崩
當某一時刻發生大規模的快取失效的情況,比如你的快取服務當機了,會有大量的請求進來直接打到DB上面。
解決方案:
1.增加快取系統可用性,通過監控關注快取的健康程度,根據業務量適當的擴容快取。
2.採用多級快取,不同級別快取設定的超時時間不同,及時某個級別快取都過期,也有其他級別快取兜底。
3.快取的過期時間可以取個隨機值,儘量讓不同Key的過期時間不同。
六、快取更新策略
(1)Cache Aside
應用查詢資料的時候先查詢快取層的資料,如果快取中沒有則到資料庫中查詢資料,並把資料放入快取層。
更新資料的時候先對資料庫進行更新,然後通過指令使快取層的資料失效。
(2)Read/Write Through
應用要讀資料和更新資料都直接訪問快取服務
快取服務同步的將資料更新到資料庫
(3)Write Behind
應用要讀資料和更新資料都直接訪問快取服務
快取服務非同步的將資料更新到資料庫(通過非同步任務)
最後
正確的使用快取可以讓系統效能有提升,要注意需要針對不同場景來設計最佳的快取方案。實踐出真知,要想真正掌握快取,還是需要在專案設計中多多考慮、
本作品採用《CC 協議》,轉載必須註明作者和本文連結