快取穿透透析

2021-09-28 23:05:14 字數 1360 閱讀 4581

快取穿透簡單的理解為沒有命中快取,即快取失效,請求全部打到外部磁碟io裝置上,比如資料庫,因為資料庫相對來說是比較慢的,所以請求會阻塞在資料庫上,應用伺服器的執行緒不能及時釋放,如果量比較大的話,會導致頻繁的執行緒切換,導致cpu飆公升,還有可能會導致伺服器資源耗盡,比如記憶體等。

大概可分為兩類,一類是查詢資料庫不存在的記錄,另外一類是快取到期。正常情況下,查詢不存在的資料記錄時,請求直接打到資料庫,並且因為沒有資料,所有不會回填快取。下次請求過來,還是重複這個過程,導致快取穿透。當有大規模併發請求時,快取正好到期,導致第一次請求還沒有回填到快取,大量的請求打到資料庫,造成快取穿透,這種是「狗樁效應」。

解決快取穿透的問題,大致有兩種方法,分別是無值回填和布隆過濾器。下面就這兩種方式做法或者說原理簡單的介紹一下。首先說無值回填。空值填充,此方法主要解決第一類快取穿透場景,就是說在請求過來的時候,首先查詢快取,快取裡面沒有資料,然後查詢資料庫,資料庫裡面也沒有資料,這個時候需要回填快取,把空值回填到快取,這樣的話,再有查詢過來的時候就會命中快取,解決快取穿透問題。但是這種方法一定要注意,由於空值並不是我們想要的業務資料,所以不能長時間的占用快取,在回填空值的時候,設定乙個比較短的過期時間。但是這種方法也有缺點,當大量請求資料都不存在的情況下,會占用很多快取,比如當使用者註冊的時候會check手機號,這種情況下就會在快取中回填很多空值,占用大量快取容量。當快取滿的時候,用可能把正常的資料替換掉。

第二種方法就是布隆過濾器,首先介紹一下布隆過濾器,布隆過濾器是有乙個二進位制陣列和乙個hash演算法組成,具體工作思路是我們對於每乙個值按照hash演算法算出乙個hash值,然後用這個hash值對這個陣列取模,得到的模數就是這個值所在的陣列索引值,並且將陣列對應的位置由0改為1,在判斷乙個值是否在這個集合中時,你只需要把這個值按照同樣的演算法算出索引值,看看陣列所在的位置是否為1,如果為1表明已存在,如果為0,表明此值不在集合中。舉個例子,我們經常遇到乙個這樣的業務,在使用者中測試,判斷使用者的手機號是否已存在,如果存在就報錯,如果不存在就註冊。如果我們不使用快取,當使用者量非常大時,查詢起來比較慢。所以我們把存在的手機號快取在快取中,使用快取check手機號是否存在的時候,我們就用到了布隆過濾器,具體做法如下,我們首先初始化乙個20億bit資料,使用乙個hash演算法來計算使用者id的索引值,我們將目前所有使用者的id計算出來的所以位置的值設為1,其他地方的值為0.新註冊的使用者出了寫到資料庫中,還要使用同樣的演算法,把計算出來的陣列的位置表為1.當我們要查詢某個使用者的資訊時,我們首先檢查在某個使用者的id是否存在在布隆過濾器裡面,如果不存在就直接返回空值,而不需要繼續查詢資料庫和快取,這樣就可以極大的減少異常查詢帶來的快取穿透。但是布隆過濾器也存在問題,因為使用了hash演算法,所有會存在hash碰撞的問題,所有會存在誤判,但是布隆過濾器特別適合判斷元素不存在的情況,為快取穿透問題。布隆過濾器還會消耗比較大的空間,所以要根據業務場景選擇是否能夠使用布隆過濾器。

Redis快取穿透,穿透擊穿,快取雪崩

乙個一定不存在快取及查詢不到的資料,由於快取是不命中時被動寫的,並且出於容錯考慮,如果從儲存層查不到資料則不寫入快取,這將導致這個不存在的資料每次請求都要到儲存層去查詢,失去了快取的意義。有很多種方法可以有效地解決快取穿透問題,最常見的則是採用布隆過濾器,將所有可能存在的資料雜湊到乙個足夠大的bit...

快取 redis 快取穿透

哪一些因素 考慮使用redis,畢竟 redis 也要增加成本 1 熱點資料 2 讀的成本非常大 3 讀多寫少 4 對資料一致性要求 沒有那麼嚴格 可以出現資料與資料庫不一致 1 秒殺場景 3 物流查詢軌跡 熱點資料 啟用的資料是被快取到redis 當中 快取key 乙個時間點過期的時候,如果快取資...

快取穿透 快取雪崩

一 快取穿透 描述 快取穿透是指快取和資料庫中都沒有的資料,而使用者不斷發起請求,如發起為id為 1 的資料或id為特別大不存在的資料。這時的使用者很可能是攻擊者,攻擊會導致資料庫壓力過大。解決方案 1 介面層增加校驗,如使用者鑑權校驗,id做基礎校驗,id 0的直接攔截 2 從快取取不到的資料,在...