緩存穿透
緩存穿透,是指查詢一個數(shù)據(jù)庫一定不存在的數(shù)據(jù)。正常的使用緩存流程大致是,數(shù)據(jù)查詢先進行緩存查詢,如果key不存在或者key已經(jīng)過期,再對數(shù)據(jù)庫進行查詢,并把查詢到的對象,放進緩存。如果數(shù)據(jù)庫查詢對象為空,則不放進緩存。
Redis緩存流程
代碼流程
參數(shù)傳入對象主鍵ID根據(jù)key從緩存中獲取對象如果對象不為空,直接返回如果對象為空,進行數(shù)據(jù)庫查詢?nèi)绻麖臄?shù)據(jù)庫查詢出的對象不為空,則放入緩存(設定過期時間)想象一下這個情況,如果傳入的參數(shù)為-1,會是怎么樣?這個-1,就是一定不存在的對象。就會每次都去查詢數(shù)據(jù)庫,而每次查詢都是空,每次又都不會進行緩存。假如有惡意攻擊,就可以利用這個漏洞,對數(shù)據(jù)庫造成壓力,甚至壓垮數(shù)據(jù)庫。即便是采用UUID,也是很容易找到一個不存在的KEY,進行攻擊。
小編在工作中,會采用緩存空值的方式,也就是【代碼流程】中第5步,如果從數(shù)據(jù)庫查詢的對象為空,也放入緩存,只是設定的緩存過期時間較短,比如設置為60秒。
緩存空值
緩存雪崩
緩存雪崩,是指在某一個時間段,緩存集中過期失效。
產(chǎn)生雪崩的原因之一,比如在寫本文的時候,馬上就要到雙十二零點,很快就會迎來一波搶購,這波商品時間比較集中的放入了緩存,假設緩存一個小時。那么到了凌晨一點鐘的時候,這批商品的緩存就都過期了。而對這批商品的訪問查詢,都落到了數(shù)據(jù)庫上,對于數(shù)據(jù)庫而言,就會產(chǎn)生周期性的壓力波峰。
小編在做電商項目的時候,一般是采取不同分類商品,緩存不同周期。在同一分類中的商品,加上一個隨機因子。這樣能盡可能分散緩存過期時間,而且,熱門類目的商品緩存時間長一些,冷門類目的商品緩存時間短一些,也能節(jié)省緩存服務的資源。
緩存時間加入suijiyinzi
其實集中過期,倒不是非常致命,比較致命的緩存雪崩,是緩存服務器某個節(jié)點宕機或斷網(wǎng)。因為自然形成的緩存雪崩,一定是在某個時間段集中創(chuàng)建緩存,那么那個時候數(shù)據(jù)庫能頂住壓力,這個時候,數(shù)據(jù)庫也是可以頂住壓力的。無非就是對數(shù)據(jù)庫產(chǎn)生周期性的壓力而已。而緩存服務節(jié)點的宕機,對數(shù)據(jù)庫服務器造成的壓力是不可預知的,很有可能瞬間就把數(shù)據(jù)庫壓垮。
緩存擊穿
緩存擊穿,是指一個key非常熱點,在不停的扛著大并發(fā),大并發(fā)集中對這一個點進行訪問,當這個key在失效的瞬間,持續(xù)的大并發(fā)就穿破緩存,直接請求數(shù)據(jù)庫,就像在一個屏障上鑿開了一個洞。
小編在做電商項目的時候,把這貨就成為“爆款”。
其實,大多數(shù)情況下這種爆款很難對數(shù)據(jù)庫服務器造成壓垮性的壓力。達到這個級別的公司沒有幾家的。所以,務實主義的小編,對主打商品都是早早的做好了準備,讓緩存永不過期。即便某些商品自己發(fā)酵成了爆款,也是直接設為永不過期就好了。
大道至簡,mutex key互斥鎖真心用不上。