緩存穿透與緩存雪崩


原文地址:http://www.cnblogs.com/fidelQuan/p/4543387.html

緩存穿透

什么是緩存穿透?

一般的緩存系統,都是按照key去緩存查詢,如果不存在對應的value,就應該去后端系統查找(比如DB)。如果key對應的value是一定不存在的,並且對該key並發請求量很大,就會對后端系統造成很大的壓力。這就叫做緩存穿透。
 

如何避免?

1:對查詢結果為空的情況也進行緩存,緩存時間設置短一點,或者該key對應的數據insert了之后清理緩存。
2:對一定不存在的key進行過濾。可以把所有的可能存在的key放到一個大的Bitmap中,查詢時通過該bitmap過濾。【感覺應該用的不多吧】

緩存雪崩

什么是緩存雪崩?

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

如何避免?

1:在緩存失效后,通過加鎖或者隊列來控制讀數據庫寫緩存的線程數量。比如對某個key只允許一個線程查詢數據和寫緩存,其他線程等待。
2:不同的key,設置不同的過期時間,讓緩存失效的時間點盡量均勻。
3:做二級緩存,A1為原始緩存,A2為拷貝緩存,A1失效時,可以訪問A2,A1緩存失效時間設置為短期,A2設置為長期(此點為補充)
 

分布式緩存系統

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

緩存一致性問題

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

2:有繼承關系的緩存之間的一致性。為了盡量提高緩存命中率,緩存也是分層:全局緩存,二級緩存。他們是存在繼承關系的。全局緩存可以有二級緩存來組成。 

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

緩存穿透和緩存雪崩

上面有講述。
 

緩存數據的淘汰

緩存淘汰的策略有兩種: (1) 定時去清理過期的緩存。 (2)當有用戶請求過來時,再判斷這個請求所用到的緩存是否過期,過期的話就去底層系統得到新數據並更新緩存。 
兩者各有優劣,第一種的缺點是維護大量緩存的key是比較麻煩的,第二種的缺點就是每次用戶請求過來都要判斷緩存失效,邏輯相對比較復雜,具體用哪種方案,大家可以根據自己的應用場景來權衡。
 
1. 預估失效時間 2. 版本號(必須單調遞增,時間戳是最好的選擇)3. 提供手動清理緩存的接口。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM