快取穿透 快取併發 快取雪崩 快取預熱

2021-08-22 07:13:11 字數 1712 閱讀 5588

快取穿透、快取併發和快取雪崩是常見的由高併發引起的快取問題,而快取預熱是快取雪崩的一種解決方案。

快取穿透指的是併發使用大量快取中不存在的key進行查詢,由於快取無法命中,大量的查詢會穿過快取直接查詢資料庫,使得資料庫壓力太大,導致資料庫可能被拖垮。

一般是受到了惡意的攻擊才會導致這種問題,所以一旦遇到了快取穿透的問題就會非常棘手,所以我們需要在**層面提前盡量規避掉這個問題。下面介紹幾種規避方案:

1.1 快取空值

我們可以將從資料庫查詢不到結果的key也存到快取中,value為nul,這樣下次再查詢該key的時候就會在快取中拿到null直接返回,而不會去資料庫查詢了。

如果攻擊者一直使用不同的key來攻擊,那麼不僅會引起快取穿透的問題,同時還會導致快取中存了大量null值的key(空值可以不用快取太久,設定乙個有效期可以提前釋放快取),所以光快取空值還不夠,還需要和其他方案相結合。

1.2 使用有規則的key

通常快取的key都是乙個指定字首加乙個id拼接組成的,那麼我們可以對這個進行合法校驗。

比如說id的長度是否合法,以及我們可以按照一定規則生成快取key中的id,這樣在有查詢過來的時候我們可以先校驗一下key是否合法,不合法的話直接返回null。

1.3 使用布隆過濾器儲存所有可能的key,再進行校驗查詢的key

我們可以把所有可能的key放到乙個集合裡,這樣乙個請求過來的時候,可以先去集合裡看是否存在這個key,不存在就直接返回null。

這裡我們校驗key是否存在在集合中的時候的要求是:

- 在集合中的元素一定要返回」在集合中」

- 但是不在集合中的元素我們允許一定概率的返回」在集合中」

所以我們可以使用布隆過濾器來幫我們實現這個資料結構,幫我們過濾掉大量不合法的key。

快取併發指定是在查詢高併發的場景下,如果某乙個快取的key過期了,那麼將有大量的請求訪問資料庫並且會寫快取,這樣會導致資料庫的壓力變大。

如果從快取中查詢不到結果,那麼就會去資料庫查詢,那麼可以對這一段**加鎖,這樣其他請求就會進入等待,可以使用下面的**實現:

if (result == null)

getfromdb(key)

......

}} 當然了,加鎖會導致其他執行緒等待,那麼執行緒等待還是資料庫壓力二者之間就需要根據具體業務場景做乙個抉擇了。

快取雪崩指的是大量key同時失效或者快取伺服器重啟(清除快取資料)之後,大量的使用者請求湧入伺服器導致所有壓力全部落到資料庫上,從而壓垮資料庫。

快取雪崩的問題的引發可以分為兩個部分,乙個是大量key同時過期,另乙個是快取伺服器重啟,下面我們分兩中情況來分析一下解決方案。

3.1 大量key同時過期

大量key同時過期是由於我們寫入快取的時候設定的有效時間相同導致的,所以我們可以在快取時間上再加上一定的隨機數使得不同的key失效時間不一致就行了。

3.2 快取伺服器重啟

快取伺服器重啟導致快取清空的問題可以使用快取預熱來解決,我們直接看下面的快取預熱。

快取預熱指的是在快取系統重啟(沒有任何快取資料)的時候,提前將熱點資料載入到快取中。

我們可以在深夜或者使用者訪問量不大的時候進行快取伺服器的重啟,重啟之後進行快取預熱,提前預熱部分熱點資料。

需要注意的是快取預熱的時候可以對快取資料的有效時間加上一定的隨機數,不然可能會導致大量的key同時過期。

通常在業務併發量不是太大的場景下很難遇到上面描述的幾個問題,但是理論知識我們還是要了解一下的。

今天關於快取的分享就到這裡了,希望大家多多支援。

Redis快取穿透 快取併發 快取雪崩

一 快取穿透 1.產生原因 查詢方式是先查詢快取 如果快取不存在則查詢資料庫 將查詢的結果回寫到快取 穿透的概念是快取不存在的情況下查詢資料庫 高併發應用下可能造成資料庫壓力過大 2.解決方案 2.1 將對應的key為空的值也快取起來,減少資料庫的查詢 2.2 校驗key值的合法性 防止惡意攻擊 二...

Redis 快取穿透 快取併發 快取雪崩

快取穿透 快取併發 快取雪崩是常見的由於高併發而導致的快取問題。下面講解其產生原因和解決方案。快取穿透通常是由於惡意攻擊或無意造成的 快取併發是由於設計不足造成的 快取雪崩是由於大量快取同時失效造成的。三種問題都比較典型,是難以防範和解決的。下面講解其解決方案,以便在快取設計中進行參考。1 快取穿透...

快取穿透 快取併發和快取雪崩

快取穿透 快取併發和快取雪崩是常見的由於併發量大而導致的快取問題。快取穿透通常是由惡意攻擊或者無意造成的 快取併發是由於設計不足 快取雪崩是快取同時失效造成的。快取穿透 快取穿透是使用了不存在的key進行大量的高併發查詢,導致快取無法命中,每次快取穿透後都要去資料庫中進行查詢,導致資料庫壓力過大甚至...