緩存穿透與緩存雪崩

緩存穿透

什麼是緩存穿透?

通常的緩存系統,都是按照key去緩存查詢,若是不存在對應的value,就應該去後端系統查找(好比DB)。若是key對應的value是必定不存在的,而且對該key併發請求量很大,就會對後端系統形成很大的壓力。這就叫作緩存穿透redis

 

如何避免?

1:對查詢結果爲空的狀況也進行緩存,緩存時間設置短一點,或者該key對應的數據insert了以後清理緩存。數據庫

2:對必定不存在的key進行過濾。能夠把全部的可能存在的key放到一個大的Bitmap中,查詢時經過該bitmap過濾。後端

3: 即使DB查詢結果爲空,也能夠將這個key的緩存值設爲null,以減小緩存的壓力。緩存

 

緩存雪崩

什麼是緩存雪崩?

當緩存服務器重啓或者大量緩存集中在某一個時間段失效,這樣在失效的時候,也會給後端系統(好比DB)帶來很大壓力。服務器

如何避免?

1:在緩存失效後,經過加鎖或者隊列來控制讀數據庫寫緩存的線程數量。好比對某個key只容許一個線程查詢數據和寫緩存,其餘線程等待。併發

2:不一樣的key,設置不一樣的過時時間,讓緩存失效的時間點儘可能均勻。分佈式

3:作二級緩存,A1爲原始緩存,A2爲拷貝緩存,A1失效時,能夠訪問A2,A1緩存失效時間設置爲短時間,A2設置爲長期spa

A.根據業務統計的維度或是場景,創建一張以JSON格式爲模板的表;線程

B.經過調度平臺,定時地逐個訪問一遍全部的key,將值保存至模板表中和緩存集羣中;繼承

C.不斷對2進行輪詢,保持key-value的熱度和完整性;

D.用戶請求過來,先訪問咱們的緩存,一旦緩存失效或是重啓,直接從數據庫模板表中獲取最新的熱度數據並緩存,這樣咱們就能有效的減輕數據庫的壓力;

E.這也是一種緩存預熱的方案;

 

分佈式緩存系統

分佈式緩存系統面臨的問題

緩存一致性問題

1:緩存系統與底層數據的一致性。這點在底層系統是「可讀可寫」時,顯得尤其重要。

2:有繼承關係的緩存之間的一致性。爲了儘可能提升緩存命中率,緩存也是分層:全局緩存,二級緩存。它們是存在繼承關係的。全局緩存能夠由二級緩存來組成。 

3:多個緩存副本之間的一致性。爲了保證系統的高可用性,緩存系統背後每每會接兩套存儲系統(如memcache,redis等)

緩存穿透和緩存雪崩

上面有講述。

 

緩存數據的淘汰

緩存淘汰的策略有兩種: (1) 定時去清理過時的緩存。 (2)當有用戶請求過來時,判斷這個請求所用到的緩存是否過時,過時的話就去底層系統獲得新數據並更新緩存。 

二者各有優劣,第一種的缺點是維護大量緩存的key是比較麻煩的,第二種的缺點就是每次用戶請求過來都要判斷緩存失效,邏輯相對比較複雜,具體用哪一種方案,你們能夠根據本身的應用場景來權衡。

 

1. 預估失效時間  2. 版本號(必須單調遞增,時間戳是最好的選擇)3. 提供手動清理緩存的接口。

相關文章
相關標籤/搜索