緩存基礎整理

1、理解緩存

以空間換時間,全部保存「中間的、額外的」數據的機制,均可以稱之爲緩存。redis

2、緩存的做用

經過如下兩點,對系統性能有提高sql

(1)縮短期,有些數據可能查詢起來或是運算起來很花時間, 那麼咱們就能夠在某次獲取該數據後放在能夠快速取回的地方。數據庫

(2)下降壓力,在高併發的狀況下可能會致使數據庫壓力過大,藉助數據緩存能夠很好的規避這種問題。緩存

3、緩存的合理性

(1)訪問頻率是高仍是低?架構

若是訪問頻率低,緩存帶來的業務複雜度弊端會高於系統性能提升的優點;因此訪問頻率高,適合緩存,並且效果也好些;併發

(2) 讀寫比例是什麼樣的?異步

訪問頻率高,讀多寫少,適合緩存,效果會好分佈式

(3)數據一致性要求高嗎?ide

使用緩存適用那些對數據一致性要求不高的業務。高併發

4、緩存的進化

(1)業務開始時,使用關係型數據庫

(2)用戶量上來後,將數據庫改成讀寫分離的架構。

(3)仍是撐不住,增長數據緩存層(redis)

(4)進一步優化,再次增長緩存層,造成多級緩存

(5)經過增長緩存監控,確保緩存的有效性,以及進一步優化緩存的策略等

5、緩存常見問題

下面所說的三種問題緩存方案都相似於Redis+Mysql,首先先從緩存中獲取數據,找不到的時候去數據庫獲取數據並更新到緩存中。

(1)緩存穿透

請求去查詢一條壓根兒數據庫中根本就不存在的數據,也就是緩存和數據庫都查詢不到這條數據,可是請求每次都會打到數據庫上面去。

解決方案:

1.對於返回爲NULL的依然緩存

2.制定一些規則過濾一些不可能存在的數據

(2)緩存擊穿

在日常高併發的系統中,大量的請求同時查詢一個 key 時,此時這個key正好失效了,就會致使大量的請求都打到數據庫上面去。這種現象咱們稱爲緩存擊穿。

解決方案:

1.加分佈式鎖,對於獲取到這個鎖的線程,查詢數據庫更新緩存,其餘線程採起重試策略

2.採起到期自動刷新的策略,而不是到期自動淘汰

(3)緩存雪崩

當某一時刻發生大規模的緩存失效的狀況,好比你的緩存服務宕機了,會有大量的請求進來直接打到DB上面。

解決方案:

1.增長緩存系統可用性,經過監控關注緩存的健康程度,根據業務量適當的擴容緩存。

2.採用多級緩存,不一樣級別緩存設置的超時時間不一樣,及時某個級別緩存都過時,也有其餘級別緩存兜底。

3.緩存的過時時間能夠取個隨機值,儘可能讓不一樣Key的過時時間不一樣。

6、緩存更新策略

(1)Cache Aside

應用查詢數據的時候先查詢緩存層的數據,若是緩存中沒有則到數據庫中查詢數據,並把數據放入緩存層。

更新數據的時候先對數據庫進行更新,而後經過指令使緩存層的數據失效。

(2)Read/Write Through

應用要讀數據和更新數據都直接訪問緩存服務

緩存服務同步的將數據更新到數據庫

(3)Write Behind

應用要讀數據和更新數據都直接訪問緩存服務

緩存服務異步的將數據更新到數據庫(經過異步任務)

最後

正確的使用緩存可讓系統性能有提高,要注意須要針對不一樣場景來設計最佳的緩存方案。實踐出真知,要想真正掌握緩存,仍是須要在項目設計中多多考慮、

相關文章
相關標籤/搜索