一般的快取系統,都是依照key去快取查詢,假設不存在相應的value,就應該去後端系統查詢(比方db)。
假設key相應的value是一定不存在的,而且對該key併發請求量非常大。就會對後端系統造成非常大的壓力。這就叫做快取穿透。
1:對查詢結果為空的情況也進行快取。快取時間設定短一點,或者該key相應的資料insert了之後清理快取。
2:對一定不存在的key進行過濾。
能夠把全部的可能存在的key放到乙個大的bitmap中。查詢時通過該bitmap過濾。
【感覺應該用的不多吧】
當快取server重新啟動或者大量快取集中在某乙個時間段失效,這樣在失效的時候,也會給後端系統(比方db)帶來非常大壓力。
1:在快取失效後,通過加鎖或者佇列來控制讀資料庫寫快取的執行緒數量。
比方對某個key僅僅同意乙個執行緒查詢資料和寫快取。其它執行緒等待。
2:不同的key,設定不同的過期時間,讓快取失效的時間點盡量均勻。
3:做二級快取,a1為原始快取,a2為拷貝快取,a1失效時。能夠訪問a2。a1快取失效時間設定為短期,a2設定為長期(此點為補充)
快取一致性問題
1:快取系統與底層資料的一致性。
這點在底層系統是「可讀可寫」時。寫得尤為重要
2:有繼承關係的快取之間的一致性。為了盡量提高快取命中率。快取也是分層:全域性快取,二級快取。
他們是存在繼承關係的。全域性快取能夠有二級快取來組成。
3:多個快取副本之間的一致性。為了保證系統的高可用性,快取系統背後往往會接兩套儲存系統(如memcache,redis等)
快取穿透和快取雪崩
上面有講述。
快取淘汰的策略有兩種: (1) 定時去清理過期的快取。 (2)當實使用者請求過來時,再推斷這個請求所用到的快取是否過期。過期的話就去底層系統得到新資料並更新快取。
兩者各有優劣,第一種的缺點是維護大量快取的key是比較麻煩的,另外一種的缺點就是每次使用者請求過來都要推斷快取失效,邏輯相對照較複雜。詳細用哪種方案。大家能夠依據自己的應用場景來權衡。
1. 預估失效時間
2. 版本(必須單調遞增,時間戳是最好的選擇)
3. 提供手動清理快取的介面。
快取穿透與快取雪崩
一般的快取系統,都是按照key去快取查詢,如果不存在對應的value,就應該去後端系統查詢 比如db 如果key對應的value是一定不存在的,並且對該key併發請求量很大,就會對後端系統造成很大的壓力。這就叫做快取穿透。1 對查詢結果為空的情況也進行快取,快取時間設定短一點,或者該key對應的資料...
快取穿透與快取雪崩
引用原文 快取系統不得不考慮的另乙個問題是快取穿透與失效時的雪崩效應。快取穿透是指查詢乙個一定不存在的資料,由於快取是不命中時被動寫的,並且出於容錯考慮,如果從儲存層查不到資料則不寫入快取,這將導致這個存在的資料每次請求都要到儲存層去查詢,失去了快取的意義。有 很多種方法可以有效地解決快取穿透問題,...
快取穿透與快取雪崩
一般的快取系統,都是按照key去快取查詢,如果不存在對應的value,就應該去後端系統查詢 比如db 如果key對應的value是一定不存在的,並且對該key併發請求量很大,就會對後端系統造成很大的壓力。這就叫做快取穿透。1 對查詢結果為空的情況也進行快取,快取時間設定短一點,或者該key對應的資料...