快取三大問題及解決方案

2022-05-02 10:18:11 字數 1265 閱讀 4349

隨著網際網路系統發展的逐步完善,提高系統的qps,目前的絕大部分系統都增加了快取機制從而避免請求過多的直接與資料庫操作從而造成系統瓶頸,極大的提公升了使用者體驗和系統穩定性。

雖然使用快取給系統帶來了一定的質的提公升,但同時也帶來了一些需要注意的問題。

快取穿透是指查詢乙個一定不存在的資料,因為快取中也無該資料的資訊,則會直接去資料庫層進行查詢,從系統層面來看像是穿透了快取層直接達到db,從而稱為快取穿透,沒有了快取層的保護,這種查詢一定不存在的資料對系統來說可能是一種危險,如果有人惡意用這種一定不存在的資料來頻繁請求系統,不,準確的說是攻擊系統,請求都會到達資料庫層導致db癱瘓從而引起系統故障。

快取穿透業內的解決方案已經比較成熟,主要常用的有以下幾種:

在普通的快取系統中一般例如redis、memcache等中,我們會給快取設定乙個失效時間,但是如果所有的快取的失效時間相同,那麼在同一時間失效時,所有系統的請求都會傳送到資料庫層,db可能無法承受如此大的壓力導致系統崩潰。

快取擊穿實際上是快取雪崩的乙個特例,大家使用過微博的應該都知道,微博有乙個熱門話題的功能,使用者對於熱門話題的搜尋量往往在一些時刻會大大的高於其他話題,這種我們成為系統的「熱點「,由於系統中對這些熱點的資料快取也存在失效時間,在熱點的快取到達失效時間時,此時可能依然會有大量的請求到達系統,沒有了快取層的保護,這些請求同樣的會到達db從而可能引起故障。擊穿與雪崩的區別即在於擊穿是對於特定的熱點資料來說,而雪崩是全部資料。

lru-k演算法 ,其實上面的演算法也是該演算法的特例情況即lru-1,上面的演算法存在較多的不合理性,在實際的應用過程中採用該演算法進行了改進,例如偶然的資料影響會造成命中率較低,比如某個資料即將到達底部即將被淘汰,但由於一次的請求又放入了頭部,此後再無該資料的請求,那麼該資料的繼續存在其實是不合理的,針對這類情況lru-k演算法擁有更好的解決措施。結構圖如下所示:

lru-k需要多維護乙個佇列或者更多,用於記錄所有快取資料被訪問的歷史。只有當資料的訪問次數達到k次的時候,才將資料放入快取。當需要淘汰資料時,lru-k會淘汰第k次訪問時間距當前時間最大的資料。

相比lru,lru-k需要多維護乙個佇列,用於記錄所有快取資料被訪問的歷史,所以需要更多的記憶體空間來用來構建快取,但優點也很明顯,較好的降低了資料的汙染率提高了快取的命中率,對於系統來說可以用一定的硬體成本來換取系統效能也不失為一種辦法。當然還有更為複雜的快取結構演算法,點選lru演算法即可學習,例如two queues和mutil queues等等,本文不過多贅述,只為讀者提供一種解決思路。

考文章: 雙11萬億流量下的分布式快取 

快取淘汰演算法

快取三大問題及解決方案

隨著網際網路系統發展的逐步完善,提高系統的qps,目前的絕大部分系統都增加了快取機制從而避免請求過多的直接與資料庫操作從而造成系統瓶頸,極大的提公升了使用者體驗和系統穩定性。雖然使用快取給系統帶來了一定的質的提公升,但同時也帶來了一些需要注意的問題。快取穿透是指查詢乙個一定不存在的資料,因為快取中也...

快取的三大問題以及解決方案

redis經常用於系統中的快取,這樣可以解決目前io裝置無法滿足網際網路應用海量的讀寫請求的問題。快取穿透是指快取和資料庫中都沒有的資料,而使用者不斷發起請求,如發起id為 1的資料或者特別大的不存在的資料。有可能是黑客利用漏洞攻擊從而去壓垮應用的資料庫。對於快取穿透問題,常見的解決方案有以下三種 ...

快取世界中的三大問題及解決方案

試想一下,如果有黑客會對你的系統進行攻擊,拿乙個不存在的id 去查詢資料,會產生大量的請求到資料庫去查詢。可能會導致你的資料庫由於壓力過大而宕掉。2.3.1 快取空值 之所以會發生穿透,就是因為快取中沒有儲存這些空資料的key。從而導致每次查詢都到資料庫去了。那麼我們就可以為這些key對應的值設定為...