Redis緩存穿透、緩存雪崩和緩存擊穿理解

1.緩存穿透(不存在的商品訪問數據形成壓力)數據庫

緩存穿透,是指查詢一個數據庫必定不存在的數據。正常的使用緩存流程大體是,數據查詢先進行緩存查詢,若是key不存在或者key已通過期,再對數據庫進行查詢,並把查詢到的對象,放進緩存。若是數據庫查詢對象爲空,則不放進緩存。緩存

Redis緩存流程

代碼流程服務器

參數傳入對象主鍵ID根據key從緩存中獲取對象若是對象不爲空,直接返回若是對象爲空,進行數據庫查詢若是從數據庫查詢出的對象不爲空,則放入緩存(設定過時時間)想象一下這個狀況,若是傳入的參數爲-1,會是怎麼樣?這個-1,就是必定不存在的對象。就會每次都去查詢數據庫,而每次查詢都是空,每次又都不會進行緩存。假若有惡意攻擊,就能夠利用這個漏洞,對數據庫形成壓力,甚至壓垮數據庫。即使是採用UUID,也是很容易找到一個不存在的KEY,進行攻擊。併發

小編在工做中,會採用緩存空值的方式,也就是【代碼流程】中第5步,若是從數據庫查詢的對象爲空,也放入緩存,只是設定的緩存過時時間較短,好比設置爲60秒。ui

緩存空值

2.緩存雪崩(集中式的緩存失效)spa

緩存雪崩,是指在某一個時間段,緩存集中過時失效。3d

產生雪崩的緣由之一,好比在寫本文的時候,立刻就要到雙十二零點,很快就會迎來一波搶購,這波商品時間比較集中的放入了緩存,假設緩存一個小時。那麼到了凌晨一點鐘的時候,這批商品的緩存就都過時了。而對這批商品的訪問查詢,都落到了數據庫上,對於數據庫而言,就會產生週期性的壓力波峯。對象

小編在作電商項目的時候,通常是採起不一樣分類商品,緩存不一樣週期。在同一分類中的商品,加上一個隨機因子。這樣能儘量分散緩存過時時間,並且,熱門類目的商品緩存時間長一些,冷門類目的商品緩存時間短一些,也能節省緩存服務的資源。blog

緩存時間加入suijiyinzi

其實集中過時,倒不是很是致命,比較致命的緩存雪崩,是緩存服務器某個節點宕機或斷網。由於天然造成的緩存雪崩,必定是在某個時間段集中建立緩存,那麼那個時候數據庫能頂住壓力,這個時候,數據庫也是能夠頂住壓力的。無非就是對數據庫產生週期性的壓力而已。而緩存服務節點的宕機,對數據庫服務器形成的壓力是不可預知的,頗有可能瞬間就把數據庫壓垮。資源

3.緩存擊穿(爆款商品失效形成擊穿,設置永不過時)

緩存擊穿,是指一個key很是熱點,在不停的扛着大併發,大併發集中對這一個點進行訪問,當這個key在失效的瞬間,持續的大併發就穿破緩存,直接請求數據庫,就像在一個屏障上鑿開了一個洞。

小編在作電商項目的時候,把這貨就成爲「爆款」。

其實,大多數狀況下這種爆款很難對數據庫服務器形成壓垮性的壓力。達到這個級別的公司沒有幾家的。因此,務實主義的小編,對主打商品都是早早的作好了準備,讓緩存永不過時。即使某些商品本身發酵成了爆款,也是直接設爲永不過時就行了。

大道至簡,mutex key互斥鎖真心用不上

相關文章
相關標籤/搜索