快取的三大問題以及解決方案

2021-10-08 10:21:25 字數 1113 閱讀 2385

redis經常用於系統中的快取,這樣可以解決目前io裝置無法滿足網際網路應用海量的讀寫請求的問題。

快取穿透是指快取和資料庫中都沒有的資料,而使用者不斷發起請求,如發起id為-1的資料或者特別大的不存在的資料。有可能是黑客利用漏洞攻擊從而去壓垮應用的資料庫。

對於快取穿透問題,常見的解決方案有以下三種:

布隆過濾器是一種比較特殊的資料結構,有點類似與hashmap,在業務中我們可能會通過使用hashmap來判斷乙個值是否存在,它可以在o(1)時間複雜度內返回結果,效率極高,但是受限於儲存容量,如果可能需要去判斷的值超過億級別,那麼hashmap所佔的記憶體就很可觀了。

bloomfilter解決這個問題的方案很簡單。首先用多個bit位去代替hashmap中的陣列,這樣的話儲存空間就下來了,之後就是對 key 進行多次雜湊,將 key 雜湊後的值所對應的 bit 位置為1。

當判斷乙個元素是否存在時,就去判斷這個值雜湊出來的位元位是否都為1,如果都為1,那麼可能存在,也可能不存在(如下圖f)。但是如果有乙個bit位不為1,那麼這個key就肯定不存在。

注意:bloomfilter並不支援刪除操作,只支援新增操作。這一點很容易理解,因為你如果要刪除資料,就得將對應的bit位置為0,但是你這個key對應的bit位可能其他的key也對應著。

上面對這兩種方案都進行了簡單的介紹,快取空資料與布隆過濾器都能有效解決快取穿透問題,但使用場景有著些許不同;

快取擊穿是指當前熱點資料儲存到期時,多個執行緒同時併發訪問熱點資料。因為快取剛過期,所有併發請求都會到資料庫中查詢資料。

快取雪崩發生有幾種情況,比如大量快取集中在或者快取同時在大範圍中失效,出現了大量請求去訪問資料庫,從而導致cpu和記憶體過載,甚至停機。

乙個簡單的雪崩過程:

redis 集群產生了大面積故障;

快取失敗,此時仍有大量請求去訪問 redis 快取伺服器;

在大量 redis 請求失敗後,這些請求將會去訪問資料庫;

由於應用的設計依賴於資料庫和 redis 服務,很快就會造成伺服器集群的雪崩,最終導致整個系統的癱瘓。

快取三大問題及解決方案

隨著網際網路系統發展的逐步完善,提高系統的qps,目前的絕大部分系統都增加了快取機制從而避免請求過多的直接與資料庫操作從而造成系統瓶頸,極大的提公升了使用者體驗和系統穩定性。雖然使用快取給系統帶來了一定的質的提公升,但同時也帶來了一些需要注意的問題。快取穿透是指查詢乙個一定不存在的資料,因為快取中也...

快取三大問題及解決方案

隨著網際網路系統發展的逐步完善,提高系統的qps,目前的絕大部分系統都增加了快取機制從而避免請求過多的直接與資料庫操作從而造成系統瓶頸,極大的提公升了使用者體驗和系統穩定性。雖然使用快取給系統帶來了一定的質的提公升,但同時也帶來了一些需要注意的問題。快取穿透是指查詢乙個一定不存在的資料,因為快取中也...

快取世界中的三大問題及解決方案

試想一下,如果有黑客會對你的系統進行攻擊,拿乙個不存在的id 去查詢資料,會產生大量的請求到資料庫去查詢。可能會導致你的資料庫由於壓力過大而宕掉。2.3.1 快取空值 之所以會發生穿透,就是因為快取中沒有儲存這些空資料的key。從而導致每次查詢都到資料庫去了。那麼我們就可以為這些key對應的值設定為...