偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

架構(gòu)師面試??迹【彺嫒髥栴}及解決方案!

開發(fā) 前端
隨著互聯(lián)網(wǎng)系統(tǒng)發(fā)展的逐步完善,提高系統(tǒng)的qps,目前的絕大部分系統(tǒng)都增加了緩存機(jī)制從而避免請求過多的直接與數(shù)據(jù)庫操作從而造成系統(tǒng)瓶頸,極大的提升了用戶體驗(yàn)和系統(tǒng)穩(wěn)定性,但同時(shí)也帶來了一些需要注意的問題。

1. 緩存來由

隨著互聯(lián)網(wǎng)系統(tǒng)發(fā)展的逐步完善,提高系統(tǒng)的qps,目前的絕大部分系統(tǒng)都增加了緩存機(jī)制從而避免請求過多的直接與數(shù)據(jù)庫操作從而造成系統(tǒng)瓶頸,極大的提升了用戶體驗(yàn)和系統(tǒng)穩(wěn)定性。

2. 緩存問題

雖然使用緩存給系統(tǒng)帶來了一定的質(zhì)的提升,但同時(shí)也帶來了一些需要注意的問題。

[[249106]]

(1) 緩存穿透

緩存穿透是指查詢一個(gè)一定不存在的數(shù)據(jù),因?yàn)榫彺嬷幸矡o該數(shù)據(jù)的信息,則會直接去數(shù)據(jù)庫層進(jìn)行查詢,從系統(tǒng)層面來看像是穿透了緩存層直接達(dá)到db,從而稱為緩存穿透,沒有了緩存層的保護(hù),這種查詢一定不存在的數(shù)據(jù)對系統(tǒng)來說可能是一種危險(xiǎn),如果有人惡意用這種一定不存在的數(shù)據(jù)來頻繁請求系統(tǒng),不,準(zhǔn)確的說是攻擊系統(tǒng),請求都會到達(dá)數(shù)據(jù)庫層導(dǎo)致db癱瘓從而引起系統(tǒng)故障。

(2) 解決方案

緩存穿透業(yè)內(nèi)的解決方案已經(jīng)比較成熟,主要常用的有以下幾種:

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

[[249107]]

(3) 緩存雪崩

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

(4) 解決方案

線程互斥:只讓一個(gè)線程構(gòu)建緩存,其他線程等待構(gòu)建緩存的線程執(zhí)行完,重新從緩存獲取數(shù)據(jù)才可以,每個(gè)時(shí)刻只有一個(gè)線程在執(zhí)行請求,減輕了db的壓力,但缺點(diǎn)也很明顯,降低了系統(tǒng)的qps。

交錯(cuò)失效時(shí)間:這種方法時(shí)間比較簡單粗暴,既然在同一時(shí)間失效會造成請求過多雪崩,那我們錯(cuò)開不同的失效時(shí)間即可從一定長度上避免這種問題,在緩存進(jìn)行失效時(shí)間設(shè)置的時(shí)候,從某個(gè)適當(dāng)?shù)闹涤蛑须S機(jī)一個(gè)時(shí)間作為失效時(shí)間即可。

(5) 緩存擊穿

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

(6) 解決方案

二級緩存:對于熱點(diǎn)數(shù)據(jù)進(jìn)行二級緩存,并對于不同級別的緩存設(shè)定不同的失效時(shí)間,則請求不會直接擊穿緩存層到達(dá)數(shù)據(jù)庫。

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

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

這個(gè)鏈表即是我們的緩存結(jié)構(gòu),緩存處理步驟為

  • 首先將新數(shù)據(jù)放入鏈表的頭部
  • 在進(jìn)行數(shù)據(jù)插入的過程中,如果檢測到鏈表中有數(shù)據(jù)被再次訪問也就是有請求再次訪問這些數(shù)據(jù),那么就其插入的鏈表的頭部,因?yàn)樗鼈兿鄬ζ渌麛?shù)據(jù)來說可能是熱點(diǎn)數(shù)據(jù),具有保留時(shí)間更久的意義
  • 最后當(dāng)鏈表數(shù)據(jù)放滿時(shí)將底部的數(shù)據(jù)淘汰,也就是不常訪問的數(shù)據(jù)

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

LRU-K需要多維護(hù)一個(gè)隊(duì)列或者更多,用于記錄所有緩存數(shù)據(jù)被訪問的歷史。只有當(dāng)數(shù)據(jù)的訪問次數(shù)達(dá)到K次的時(shí)候,才將數(shù)據(jù)放入緩存。當(dāng)需要淘汰數(shù)據(jù)時(shí),LRU-K會淘汰第K次訪問時(shí)間距當(dāng)前時(shí)間最大的數(shù)據(jù)。

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

相比LRU,LRU-K需要多維護(hù)一個(gè)隊(duì)列,用于記錄所有緩存數(shù)據(jù)被訪問的歷史,所以需要更多的內(nèi)存空間來用來構(gòu)建緩存,但優(yōu)點(diǎn)也很明顯,較好的降低了數(shù)據(jù)的污染率提高了緩存的命中率,對于系統(tǒng)來說可以用一定的硬件成本來換取系統(tǒng)性能也不失為一種辦法。當(dāng)然還有更為復(fù)雜的緩存結(jié)構(gòu)算法,點(diǎn)擊LRU算法即可學(xué)習(xí),例如Two Queues和Mutil Queues等等,本文不過多贅述,只為讀者提供一種解決思路。

責(zé)任編輯:趙寧寧 來源: 今日頭條
相關(guān)推薦

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數(shù)據(jù)庫系統(tǒng)

2018-05-30 08:10:34

智慧農(nóng)業(yè)物聯(lián)網(wǎng)物聯(lián)網(wǎng)應(yīng)用

2019-10-09 16:18:36

緩存架構(gòu)雪崩

2010-08-09 09:03:17

.NET企業(yè)級架構(gòu)

2013-11-14 10:06:11

紅帽redhat

2010-10-08 16:31:08

AjaxIE6

2011-05-19 14:16:29

網(wǎng)頁設(shè)計(jì)

2021-09-13 09:44:13

架構(gòu)師軟技能技術(shù)

2010-05-12 14:18:58

Linux引導(dǎo)

2023-08-29 07:18:29

AMDN卡FSR 3

2015-05-12 16:31:22

Elasticsear開源分布式搜索引擎

2017-02-16 16:01:07

人工智能解決方案

2024-06-24 00:30:00

2020-08-26 12:33:46

架構(gòu)師技能知識

2013-11-19 20:22:02

紅帽OpenShiftOpenShift技術(shù)

2018-04-08 16:51:41

解決方案架構(gòu)師

2021-03-10 08:00:00

解決方案架構(gòu)師IT開發(fā)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號