什麼是redis快取?
Redis快取是一個開源的使用ANSIC語言編寫、支援網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API。
redis快取的作用是什麼?
Redis快取的使用,極大的提升了應用程式的效能和效率,特別是資料查詢方面。但同時,它也帶來了一些問題。其中,最要害的問題,就是資料的一致性問題,從嚴格意義上講,這個問題無解。如果對資料的一致性要求很高,那麼就不能使用快取。
另外的一些典型問題就是,快取穿透、快取雪崩和快取擊穿。目前,業界也都有比較流行的解決方案。這篇文章,不是要更完美的解決這三個問題,也不是要顛覆業界流行的解決方案。而是,從實際程式碼操作,來示範這三個問題現象。之所以要這麼做,是因為,光是看這些問題的學術解釋,腦袋裡很難有一個很形象的概念,有了實際的程式碼演示,可以加深對這些問題的理解和認識。
快取穿透
快取穿透,是指查詢一個資料庫一定不存在的資料。正常的使用快取流程大致是,資料查詢先進行快取查詢,如果key不存在或key已經過期,再對資料庫進行查詢,並把查詢到的對象,放進快取。如果資料庫查詢物件為空,則不放進快取。
程式碼流程
1、參數傳入物件主鍵ID
2、根據key從快取中取得物件
3、如果物件不為空,直接返回
4、如果物件為空,進行資料庫查詢
5、如果從資料庫查詢出的物件不為空,則放入快取(設定過期時間)想像一下這個情況,如果傳入的參數為-1,會是怎麼樣?這個-1,就是一定不存在的對象。就會每次都去查詢資料庫,而每次查詢都是空,每次又不會進行快取。假如有惡意攻擊,就可以利用這個漏洞,對資料庫造成壓力,甚至壓垮資料庫。即便是採用UUID,也是很容易找到一個不存在的KEY,進行攻擊。
小編在工作中,會採用快取空值的方式,也就是【程式碼流程】中第5步,如果從資料庫查詢的物件為空,也放入緩存,只是設定的緩存過期時間較短,例如設定為60秒。
(學習影片分享:redis影片教學)
快取雪崩
快取雪崩,是指在某個時間段,快取集中過期失效。
產生雪崩的原因之一,例如在寫本文的時候,馬上就要到雙十二零點,很快就會迎來一波搶購,這波商品時間比較集中的放入了緩存,假設緩存一個小時。那麼到了凌晨一點鐘的時候,這批商品的快取就都過期了。而對這批商品的存取查詢,都落到了資料庫上,對於資料庫而言,就會產生週期性的壓力波峰。
小編在做電商專案的時候,一般是採取不同分類商品,快取不同週期。在同一分類中的商品,加上一個隨機因子。這樣能盡可能分散緩存過期時間,而且,熱門類目的商品緩存時間長一些,冷門類目的商品緩存時間短一些,也能節省緩存服務的資源。
其實集中過期,倒不是非常致命,比較致命的快取雪崩,是快取伺服器某個節點宕機或斷網。因為自然形成的緩存雪崩,一定是在某個時間段集中創建緩存,那麼那個時候資料庫能頂住壓力,這個時候,資料庫也是可以頂住壓力的。無非就是對資料庫產生週期性的壓力而已。而快取服務節點的宕機,對資料庫伺服器造成的壓力是不可預測的,很有可能瞬間就把資料庫壓垮。
快取擊穿
快取擊穿,是指一個key非常熱點,在不停的扛著大並發,大並發集中對這一個點進行訪問,當這個key在失效的瞬間,持續的大並發就穿破緩存,直接請求資料庫,就像在一個屏障上鑿開了一個洞。
小編在做電商專案的時候,把這貨就變成「爆款」。
其實,大多數情況下這種爆款很難對資料庫伺服器造成壓垮性的壓力。達到這個等級的公司沒有幾家的。所以,務實主義的小編,對主打商品都是早期的做好了準備,讓快取永不過期。即便某些商品自己發酵成了爆款,也是直接設為永不過期就好了。
大道至簡,mutex key互斥鎖真心用不上。
學習教學分享:redis資料庫教學
#以上是redis快取雪崩、快取擊穿、快取穿透是什麼意思的詳細內容。更多資訊請關注PHP中文網其他相關文章!