快取擊穿
快取雪崩
如果在請求資料時,在快取層和資料庫層都沒有找到符合條件的資料,也就是說,在快取層和資料庫層都沒有命中資料,那麼,這種情況就叫作快取穿透。
查詢某個key對應的資料,redis快取中沒有相應的資料,則直接到資料庫中查詢。資料庫中也不存在要查詢的資料,則資料庫會返回空,而redis也不會快取這個空結果。這就造成每次通過這樣的key去查詢資料都會直接到資料庫中查詢,redis不會快取空結果。這就造成了快取穿透的問題。
1:對查詢結果為空的情況也進行快取,快取時間設定短一點,或者該 key 對應的資料 insert 了之後清理快取。
2:就是使用布隆過濾器,布隆過濾器可以針對大資料量的、有規律的鍵值進行處理。一條記錄是不是存在,本質上是乙個bool值,只需要使用 1bit 就可以儲存。我們可以使用布隆過濾器將這種表示是、否等操作,壓縮到乙個資料結構中。比如,我們最熟悉的使用者性別這種資料,就非常適合使用布隆過濾器來處理。
如果快取中的資料在某個時刻批量過期,導致大部分使用者的請求都會直接落在資料庫上,這種現象就叫作快取擊穿
我們為快取中的資料設定了過期時間。如果在某個時刻從資料庫獲取了大量的資料,並設定了相同的過期時間,這些快取的資料就會在同一時刻失效,造成快取擊穿問題。
對於比較熱點的資料,我們可以在快取中設定這些資料永不過期;也可以在訪問資料的時候,在快取中更新這些資料的過期時間;如果是批量入庫的快取項,我們可以為這些快取項分配比較合理的過期時間,避免同一時刻失效。還有一種解決方案就是:使用分布式鎖,保證對於每個key同時只有乙個執行緒去查詢後端的服務,某個執行緒在查詢後端服務的同時,其他執行緒沒有獲得分布式鎖的許可權,需要進行等待。不過在高併發場景下,這種解決方案對於分布式鎖的訪問壓力比較大。
如果快取系統出現故障,所有的併發流量就會直接到達資料庫
如果在某一時刻快取集中失效,或者快取系統出現故障,所有的併發流量就會直接到達資料庫。資料儲存層的呼叫量就會暴增,用不了多長時間,資料庫就會被大流量壓垮,這種級聯式的服務故障,就叫作快取雪崩。
1:在快取失效後,通過加鎖或者佇列來控制讀資料庫寫快取的執行緒數量。比如對某個 key 只允許乙個線 程查詢資料和寫快取,其他執行緒等待。 2:做二級快取,a1 為原始快取,a2 為拷貝快取,a1 失效時,可以訪問 a2,a1 快取失效時間設定為 短期,a2 設定為長期 3:不同的 key,設定不同的過期時間,讓快取失效的時間點盡量均勻
Redis快取穿透,穿透擊穿,快取雪崩
乙個一定不存在快取及查詢不到的資料,由於快取是不命中時被動寫的,並且出於容錯考慮,如果從儲存層查不到資料則不寫入快取,這將導致這個不存在的資料每次請求都要到儲存層去查詢,失去了快取的意義。有很多種方法可以有效地解決快取穿透問題,最常見的則是採用布隆過濾器,將所有可能存在的資料雜湊到乙個足夠大的bit...
redis 快取穿透 擊穿 雪崩
介面層增加校驗,如使用者鑑權校驗,id做基礎校驗,id 0的直接攔截 從快取取不到的資料,在資料庫中也沒有取到,這時也可以將key value對寫為key null,快取有效時間可以設定短點,如30秒 設定太長會導致正常情況也沒法使用 這樣可以防止攻擊使用者反覆用同乙個id暴力攻擊 public o...
redis快取穿透,擊穿,雪崩
快取穿透 描述 快取穿透是指快取和資料庫中都沒有的資料,而使用者不斷發起請求,多來自於黑客攻擊。由於快取是不命中時被動寫的,並且出於容錯考慮,如果從儲存層查不到資料則不寫入快取,這將導致這個不存在的資料每次請求都要到儲存層去查詢,失去了快取的意義。在流量大時,可能db就掛掉了,要是有人利用不存在的k...