快取基礎整理

caohaoyu發表於2019-06-13

一、理解快取

以空間換時間,所有儲存“中間的、額外的”資料的機制,都可以稱之為快取。

二、快取的作用

通過以下兩點,對系統效能有提升

(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 協議》,轉載必須註明作者和本文連結

相關文章