成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

架構師面試常考!緩存三大問題及解決方案!

開發 前端
隨著互聯網系統發展的逐步完善,提高系統的qps,目前的絕大部分系統都增加了緩存機制從而避免請求過多的直接與數據庫操作從而造成系統瓶頸,極大的提升了用戶體驗和系統穩定性,但同時也帶來了一些需要注意的問題。

1. 緩存來由

隨著互聯網系統發展的逐步完善,提高系統的qps,目前的絕大部分系統都增加了緩存機制從而避免請求過多的直接與數據庫操作從而造成系統瓶頸,極大的提升了用戶體驗和系統穩定性。

2. 緩存問題

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

[[249106]]

(1) 緩存穿透

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

(2) 解決方案

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

  • bloom filter:類似于哈希表的一種算法,用所有可能的查詢條件生成一個bitmap,在進行數據庫查詢之前會使用這個bitmap進行過濾,如果不在其中則直接過濾,從而減輕數據庫層面的壓力。guava中有實現BloomFilter算法。
  • 空值緩存:一種比較簡單的解決辦法,在第一次查詢完不存在的數據后,將該key與對應的空值也放入緩存中,只不過設定為較短的失效時間,例如幾分鐘,這樣則可以應對短時間的大量的該key攻擊,設置為較短的失效時間是因為該值可能業務無關,存在意義不大,且該次的查詢也未必是攻擊者發起,無過久存儲的必要,故可以早點失效。

[[249107]]

(3) 緩存雪崩

在普通的緩存系統中一般例如redis、memcache等中,我們會給緩存設置一個失效時間,但是如果所有的緩存的失效時間相同,那么在同一時間失效時,所有系統的請求都會發送到數據庫層,db可能無法承受如此大的壓力導致系統崩潰。

(4) 解決方案

線程互斥:只讓一個線程構建緩存,其他線程等待構建緩存的線程執行完,重新從緩存獲取數據才可以,每個時刻只有一個線程在執行請求,減輕了db的壓力,但缺點也很明顯,降低了系統的qps。

交錯失效時間:這種方法時間比較簡單粗暴,既然在同一時間失效會造成請求過多雪崩,那我們錯開不同的失效時間即可從一定長度上避免這種問題,在緩存進行失效時間設置的時候,從某個適當的值域中隨機一個時間作為失效時間即可。

(5) 緩存擊穿

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

(6) 解決方案

二級緩存:對于熱點數據進行二級緩存,并對于不同級別的緩存設定不同的失效時間,則請求不會直接擊穿緩存層到達數據庫。

這里參考了阿里雙11萬億流量的緩存擊穿解決方案,解決此問題的關鍵在于熱點訪問。由于熱點可能隨著時間的變化而變化,針對固定的數據進行特殊緩存是不能起到治本作用的,結合LRU算法能夠較好的幫我們解決這個問題。那么LRU是什么,下面粗略的介紹一下。

LRU(Least recently used,最近最少使用)算法根據數據的歷史訪問記錄來進行淘汰數據,其核心思想是“如果數據最近被訪問過,那么將來被訪問的幾率也更高”。最常見的實現是使用一個鏈表保存緩存數據,如下圖所示

這個鏈表即是我們的緩存結構,緩存處理步驟為

  • 首先將新數據放入鏈表的頭部
  • 在進行數據插入的過程中,如果檢測到鏈表中有數據被再次訪問也就是有請求再次訪問這些數據,那么就其插入的鏈表的頭部,因為它們相對其他數據來說可能是熱點數據,具有保留時間更久的意義
  • 最后當鏈表數據放滿時將底部的數據淘汰,也就是不常訪問的數據

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

LRU-K需要多維護一個隊列或者更多,用于記錄所有緩存數據被訪問的歷史。只有當數據的訪問次數達到K次的時候,才將數據放入緩存。當需要淘汰數據時,LRU-K會淘汰第K次訪問時間距當前時間最大的數據。

  • 第一步添加數據照樣放入第一個隊列的頭部。如果數據在該隊列里訪問沒有達到K次(該數值根據具體系統qps來定)則會繼續到達鏈表底部直至淘汰;如果該數據在隊列中時訪問次數達到了K次,那么它會被加入到接下來的2級(具體需要幾級結構也同樣結合系統分析)鏈表中,按照時間順序在2級鏈表中排列
  • 接下來2級鏈表中的操作與上面算法相同,鏈表中的數據如果再次被訪問則移到頭部,鏈表滿時,底部數據淘汰

相比LRU,LRU-K需要多維護一個隊列,用于記錄所有緩存數據被訪問的歷史,所以需要更多的內存空間來用來構建緩存,但優點也很明顯,較好的降低了數據的污染率提高了緩存的命中率,對于系統來說可以用一定的硬件成本來換取系統性能也不失為一種辦法。當然還有更為復雜的緩存結構算法,點擊LRU算法即可學習,例如Two Queues和Mutil Queues等等,本文不過多贅述,只為讀者提供一種解決思路。

責任編輯:趙寧寧 來源: 今日頭條
相關推薦

2025-02-04 17:40:44

2022-06-21 13:48:30

Redis緩存

2010-09-07 13:24:18

CSS

2019-10-08 16:05:19

Redis數據庫系統

2018-05-30 08:10:34

智慧農業物聯網物聯網應用

2019-10-09 16:18:36

緩存架構雪崩

2010-08-09 09:03:17

.NET企業級架構

2013-11-14 10:06:11

紅帽redhat

2010-10-08 16:31:08

AjaxIE6

2011-05-19 14:16:29

網頁設計

2021-09-13 09:44:13

架構師軟技能技術

2010-05-12 14:18:58

Linux引導

2023-08-29 07:18:29

AMDN卡FSR 3

2015-05-12 16:31:22

Elasticsear開源分布式搜索引擎

2017-02-16 16:01:07

人工智能解決方案

2020-08-26 12:33:46

架構師技能知識

2021-03-10 08:00:00

解決方案架構師IT開發

2020-08-26 16:56:36

架構師存儲數據庫

2013-11-19 20:22:02

紅帽OpenShiftOpenShift技術

2018-04-08 16:51:41

解決方案架構師
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久久av| 久热m3u8| 国产一区不卡 | 国产亚洲成av人片在线观看桃 | 国产精品美女 | 日本成人在线播放 | 99久久夜色精品国产亚洲96 | 日韩欧美一级 | 国产精品亚洲二区 | 一区精品国产欧美在线 | 色婷婷亚洲国产女人的天堂 | dy天堂| 国产视频三级 | 久久国产综合 | 亚洲一页 | 久久久久久国模大尺度人体 | 国产一二三区精品视频 | 久久合久久 | 国内精品在线视频 | 国产一区二区精 | 日韩精品 电影一区 亚洲 | 亚洲一级黄色 | 久热久草| 精品国产一区二区三区性色av | 国产欧美日韩在线一区 | 色精品视频 | 久久精品成人 | 蜜桃av一区二区三区 | 中文字幕在线一区二区三区 | 天天综合操 | 日韩成人精品在线 | 精品国产色 | 久久最新| 久草在线青青草 | 国产日屁| 一级片av | 国产成人免费观看 | 一区二区三区在线免费观看 | 91毛片在线看 | 国产视频一区在线 | 久久精品99久久 |