淺談緩存穿透、緩存擊穿、緩存雪崩

一、緩存的處理流程

1.一般的請求過程是:

請求
查詢
客服端
服務器
數據庫

爲了緩解數據庫的壓力,就需要設置緩存,可以使用redis來進行緩存

2.有緩存的請求過程

請求
3.查詢
1.先查詢
2.查詢結果爲null
4.返回查詢結果
5.將查詢結果存入緩存中
客服端
服務器
數據庫
緩存

只有當緩存中數據不存在時,纔會查詢數據庫,然後再將數據存入緩存中,下次再查詢時,就會從數據庫中查詢了,這樣就可以減輕了數據庫服務器的壓力

二、緩存穿透

一般都是惡意攻擊纔會發生的。

1.描述

當用戶訪問一個緩存中沒有,數據庫中也沒有的數據,那服務器拿到這個請求之後,就會先訪問緩存服務器,再訪問數據庫,但是並沒查詢到數據,就沒有向緩存中存入數據,這時如果用戶一直大量地發出這個請求,就會增大數據庫和緩存的壓力。

2.解決方法

  1. 在服務器對請求的數據進行校驗。例如查詢成績,就需要加一個接口,用來判斷要出的成績是否在0~100的範圍,如果不在,就直接返回null,減少不必要的查詢。
  2. 在緩存服務器設置一個空數據。當在數據庫中也查詢不到數據時,直接在緩存中存入一個key-null的數據,當下次再查詢這個數據時,就會直接在緩存中查詢出一個null數據返回。

三、緩存擊穿

1.描述

當緩存中的一個數據的過期時間到了(因爲緩存一般都是存儲在內存中的,爲了節省內存,一般都設置一個過期時間)這時又有大量的用戶同時對這個數據進行訪問,因爲緩存中沒有這個數據,就會導致數據庫的壓力瞬間變大。

2.解決方法

  1. 不對熱數據設置過期時間。就是常用的數據不設置過期時間,讓緩存一直有這個數據。
  2. 在服務器設置一個自動更新的時間。舉個例子,在緩存中給一個數據設置過期時間爲30分鐘,那在30分鐘之後,就對這個數據進行更新。
  3. 對訪問數據庫的方法加鎖。同一時間,只有一個用戶能夠訪問到數據庫,這可以極大的降低數據庫的壓力。

四、緩存雪崩

1.描述

當緩存中的大量數據的過期時間在同一時刻都到了,這時又有很多用戶同時訪問這些數據,就會導致數據庫壓力瞬間增大。

2.解決方法

  1. 設置過期時間時使用隨機值。當數據的過期時間隨機值時,就會極大地減少了數據同時過期的可能性。
  2. 分佈式結構的話,可以將數據緩存到多地。當數據緩存到多個緩存服務器中時,緩存中的數據同時過期的概率也會極大的降低。
  3. 可以使用緩存擊穿中的解決方法。

五、總結

緩存穿透一般是在緩存中沒有數據時纔會發生,緩存擊穿和緩存雪崩一般實在緩存中的數據的過期時間到了纔會發生,而緩存擊穿是一個數據過期了,大量用戶同時訪問;緩存雪崩是大量的數據過期了,大量的用戶同時訪問不同數據。

最後用一個比較淺顯的例子來作爲本文的結束吧。
數據庫就像我們的身體,緩存就像防彈衣。
當子彈射向我們時,防彈衣裏面都是空的(緩存中沒有數據)子彈就只能打在我們身上。
當子彈射向我們時,我們正好在更換防彈衣(緩存中的數據過期時間到了)子彈就只能打在我們身上。

我們在解決這些在緩存上發生的問題的目的,就是爲了保護數據庫。

——————————————————————————————
我想了很久,不分欄目心裏不舒服,最後就只好分到設計模式欄目了。
還有,以後的文章格式會統一採用這種,目錄-[大標題-有序/無序]-總結。以前的格式太亂了,也太醜了。
如果本文章內容有問題,請直接評論或者私信我。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章