以空間換時間,全部保存「中間的、額外的」數據的機制,均可以稱之爲緩存。redis
經過如下兩點,對系統性能有提高sql
(1)縮短期,有些數據可能查詢起來或是運算起來很花時間, 那麼咱們就能夠在某次獲取該數據後放在能夠快速取回的地方。數據庫
(2)下降壓力,在高併發的狀況下可能會致使數據庫壓力過大,藉助數據緩存能夠很好的規避這種問題。緩存
(1)訪問頻率是高仍是低?架構
若是訪問頻率低,緩存帶來的業務複雜度弊端會高於系統性能提升的優點;因此訪問頻率高,適合緩存,並且效果也好些;併發
(2) 讀寫比例是什麼樣的?異步
訪問頻率高,讀多寫少,適合緩存,效果會好分佈式
(3)數據一致性要求高嗎?ide
使用緩存適用那些對數據一致性要求不高的業務。高併發
(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
應用要讀數據和更新數據都直接訪問緩存服務
緩存服務異步的將數據更新到數據庫(經過異步任務)
正確的使用緩存可讓系統性能有提高,要注意須要針對不一樣場景來設計最佳的緩存方案。實踐出真知,要想真正掌握緩存,仍是須要在項目設計中多多考慮、