什么是redis?
redis是一個非關系型數據庫,相對於其他數據庫而言,它的查詢速度極快,且能承受的瞬時並發量非常的高。所以常常被用來存放網站的緩存,以減少主要數據庫(如mysql)的服務器壓力。
當我們要用redis作為緩存的時候, 有一些常見的經典問題我們就必須要有所考慮和防范。這里我主要介紹一下緩存穿透、緩存雪崩和緩存擊穿的現象發生的原因和防范措施。
緩存穿透
當我們用redis作緩存時, 其初始目的是為了在我們訪問某一個網頁或者商品時將此次從數據庫查詢得到的數據存放到redis中,這樣下次再次訪問時就直接去redis中取數據,減小數據庫的壓力。但是如果說我們要查詢的數據不在數據庫中的時候我們自然就無法取到它,更別說存到redis中了。這樣重點就來了, 有的黑客就利用這一點寫一個腳本高並發量的發問這個不存在的數據,造成數據庫的高頻率的查詢訪問最終導致你的數據庫崩潰。
那么如何去防范這個問題呢?
解決方案: 就是當有一個查詢為空的請求過來, 我們也將這個請求查詢的key存放到redis並設置空值, 這樣再次訪問時就不會去我們的數據庫了, 我一般設置其過期時間較短,這樣防止數據更新后無法同步到緩存。
緩存雪崩
緩存雪崩就是我們的緩存是在同一時間創建(如天貓雙十一),然后設置的緩存時間是一置的, 這樣到特定的時間就會出現緩存雪崩的情況, 此時若是有當訪問量的操作就會造成數據庫服務器的壓力過大。
解決方案: 我就拿電商的項目來舉例吧, 我們針對不同分類的商品設置的緩存過期時間不同,然后對統一分類的商品設置(一定范圍內的)隨機的過期時間,這樣就十分巧妙地避免了緩存的集中消失過期,在做的時候盡量注意一些細節,比如說熱門商品的緩存時間可以適當長一些,而冷門商品的過期時間短一些,這樣可以盡量的減少緩存服務器的壓力。
緩存擊穿
緩存擊穿就是假設我們有一件特別火爆的熱門商品, 它每天都有大量的客戶訪問, 但是既然是緩存就有過期的那一刻,所以在緩存過期的那一刻, 大量的訪問就落到了數據庫的頭上,這樣就造成了我們的緩存擊穿。(一般能達到這種情況的電商不多, 哈哈,防患於未然嘛)
解決方案:我們將主打商品就是大概率會成為爆款的商品緩存時間設置為永不過期,這樣就不會造成數據庫的壓力了, 反言之就要犧牲緩存服務器的壓力了。
以上就是我想要說的這三個問題。