真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

你與解決“緩存污染”只差這篇文章的距離

什么是緩存污染?

由于緩存的讀取速度比非緩存要快上很多,所以在高性能場(chǎng)景下,系統(tǒng)在讀取數(shù)據(jù)時(shí),是首先從緩存中查找需要的數(shù)據(jù),如果找到了則直接讀取結(jié)果,如果找不到的話,則從內(nèi)存或者硬盤(pán)中查找,再將查找到的結(jié)果存入緩存,以備下次使用。

創(chuàng)新互聯(lián)建站為企業(yè)級(jí)客戶提高一站式互聯(lián)網(wǎng)+設(shè)計(jì)服務(wù),主要包括成都網(wǎng)站制作、網(wǎng)站建設(shè)、重慶APP開(kāi)發(fā)公司、微信平臺(tái)小程序開(kāi)發(fā)、宣傳片制作、LOGO設(shè)計(jì)等,幫助客戶快速提升營(yíng)銷(xiāo)能力和企業(yè)形象,創(chuàng)新互聯(lián)各部門(mén)都有經(jīng)驗(yàn)豐富的經(jīng)驗(yàn),可以確保每一個(gè)作品的質(zhì)量和創(chuàng)作周期,同時(shí)每年都有很多新員工加入,為我們帶來(lái)大量新的創(chuàng)意。 

實(shí)際上,對(duì)于一個(gè)系統(tǒng)來(lái)說(shuō),緩存的空間是有限且寶貴的,我們不可能將所有的數(shù)據(jù)都放入緩存中進(jìn)行操作,即便可以數(shù)據(jù)安全性也得不到保證,而且,如果緩存的數(shù)據(jù)量過(guò)大大,其速度也會(huì)變得越來(lái)越慢。 這個(gè)時(shí)候就需要考慮緩存的淘汰機(jī)制,但是淘汰哪些數(shù)據(jù),又保留哪些數(shù)據(jù),這是一個(gè)問(wèn)題。如果處理不得當(dāng),就會(huì)造成“緩存污染”問(wèn)題。

而緩存污染,是指系統(tǒng)將不常用的數(shù)據(jù)從內(nèi)存移到緩存,造成常用數(shù)據(jù)的擠出,降低了緩存效率的現(xiàn)象。

解決緩存污染的算法

LFU算法

LFU,英文名Least Frequently Used,字面意思就是最不經(jīng)常使用的淘汰掉算法,是通過(guò)數(shù)據(jù)被訪問(wèn)的頻率來(lái)判斷一個(gè)數(shù)據(jù)的熱點(diǎn)情況。其核心理念是“歷史上這個(gè)數(shù)據(jù)被訪問(wèn)次數(shù)越多,那么將來(lái)其被訪問(wèn)的次數(shù)也多”。

LFU中每個(gè)數(shù)據(jù)塊都有一個(gè)引用計(jì)數(shù)器,所有數(shù)據(jù)塊按照引用數(shù)從大到小的排序。

你與解決“緩存污染”只差這篇文章的距離

步驟:

  1. 新數(shù)據(jù)插入到尾部,并將計(jì)數(shù)設(shè)置為1;

  2. 當(dāng)隊(duì)列中的數(shù)據(jù)被訪問(wèn)后,引用計(jì)數(shù)+1,然后重新排序,保持引用次數(shù)從大到小排序;

  3. 當(dāng)空間不足,需要淘汰數(shù)據(jù)時(shí),將尾部引用計(jì)數(shù)最小的數(shù)據(jù)塊刪除。

分析:由于是根據(jù)頻數(shù)進(jìn)行熱點(diǎn)判斷和淘汰,所以先天具備避免偶發(fā)性、周期性批量操作導(dǎo)致臨時(shí)非熱點(diǎn)數(shù)據(jù)大量涌入緩存,擠出熱點(diǎn)數(shù)據(jù)的問(wèn)題。 雖然具備這種先天優(yōu)勢(shì),但依舊存在另一種緩存污染問(wèn)題,即歷史熱點(diǎn)數(shù)據(jù)污染當(dāng)前熱點(diǎn)數(shù)據(jù),如果系統(tǒng)訪問(wèn)模式發(fā)生了改變,新的熱點(diǎn)數(shù)據(jù)需要計(jì)數(shù)累加超過(guò)舊熱點(diǎn)數(shù)據(jù),才能將舊熱點(diǎn)數(shù)據(jù)進(jìn)行淘汰,造成熱點(diǎn)效應(yīng)滯后的問(wèn)題。

復(fù)雜度與代價(jià):每次操作都需要進(jìn)行計(jì)數(shù)和排序,并且需要維護(hù)每個(gè)數(shù)據(jù)塊計(jì)數(shù)情況,會(huì)占用較高的內(nèi)存與cpu。

一個(gè)小思考,根據(jù)LFU算法,如何以O(shè)(1)時(shí)間復(fù)雜度實(shí)現(xiàn)get和put操作緩存?


LFU-Aging算法

LFU-Aging是基于LFU的改進(jìn)算法,目的是解決歷史熱點(diǎn)數(shù)據(jù)對(duì)當(dāng)前熱點(diǎn)數(shù)據(jù)的污染問(wèn)題。有些數(shù)據(jù)在開(kāi)始時(shí)使用次數(shù)很多,但以后就不再使用,這類(lèi)數(shù)據(jù)將會(huì)長(zhǎng)時(shí)間留在緩存中,所以“除了訪問(wèn)次數(shù)外,還要考慮訪問(wèn)時(shí)間”,這也是LFU-Aging的核心理念。

雖然算法將時(shí)間納入了考量范圍,但LFU-Aging并不是直接記錄數(shù)據(jù)的訪問(wèn)時(shí)間,而是增加了一個(gè)最大平均引用計(jì)數(shù)的閾值,然后通過(guò)當(dāng)前平均引用計(jì)數(shù)來(lái)標(biāo)識(shí)時(shí)間,換句話說(shuō),就是將當(dāng)前緩存中的平均引用計(jì)數(shù)值當(dāng)作當(dāng)前的生命年代,當(dāng)這個(gè)生命年代超過(guò)了預(yù)設(shè)的閾值,就會(huì)將當(dāng)前所有計(jì)數(shù)值減半,形成指數(shù)衰變的生命年代。

你與解決“緩存污染”只差這篇文章的距離

分析:優(yōu)點(diǎn)是當(dāng)訪問(wèn)模式發(fā)生改變的時(shí)候,生命年代的指數(shù)衰變會(huì)使LFU-Aging能夠更快的適用新的數(shù)據(jù)訪問(wèn)模式,淘汰舊的熱點(diǎn)數(shù)據(jù)。

復(fù)雜度與代價(jià):在LFU的基礎(chǔ)上又增加平均引用次數(shù)判斷和統(tǒng)計(jì)處理,對(duì)cpu的消耗更高,并且當(dāng)平均引用次數(shù)超過(guò)指定閾值(Aging)后,還需要遍歷每一個(gè)數(shù)據(jù)塊的引用計(jì)數(shù),進(jìn)行指數(shù)衰變。

Window-LFU算法

Window-LFU顧名思義叫做窗口期LFU,區(qū)別于原義LFU中記錄所有數(shù)據(jù)的訪問(wèn)歷史,Window-LFU只記錄過(guò)去一段時(shí)間內(nèi)(窗口期)的訪問(wèn)歷史,相當(dāng)于給緩存設(shè)置了有效期限,過(guò)期數(shù)據(jù)不再緩存。當(dāng)需要淘汰時(shí),將這個(gè)窗口期內(nèi)的數(shù)據(jù)按照LFU算法進(jìn)行淘汰。

分析:由于是維護(hù)一段窗口期的記錄,數(shù)據(jù)量會(huì)比較少,所以內(nèi)存占用和cpu消耗都比LFU要低。并且這段窗口期相當(dāng)于給緩存設(shè)置了有效期,能夠更快的適應(yīng)新的訪問(wèn)模式的變化,緩存污染問(wèn)題基本不嚴(yán)重。

復(fù)雜度與代價(jià):維護(hù)一段時(shí)期內(nèi)的數(shù)據(jù)訪問(wèn)記錄,并對(duì)其排序。


LRU算法

LRU算法,英文名Least Recently Used,意思是最近最少使用的淘汰算法,根據(jù)數(shù)據(jù)的歷史訪問(wèn)記錄來(lái)進(jìn)行淘汰數(shù)據(jù),核心思想是“如果數(shù)據(jù)最近被訪問(wèn)過(guò)1次,那么將來(lái)被訪問(wèn)的概率會(huì)更高”,類(lèi)似于就近優(yōu)先原則。

你與解決“緩存污染”只差這篇文章的距離

步驟:

  1. 新數(shù)據(jù)插入到鏈表頭部;

  2. 每當(dāng)命中緩存,便將命中的緩存數(shù)據(jù)移到鏈表頭部;

  3. 當(dāng)鏈表滿的時(shí)候,將鏈表尾部的數(shù)據(jù)丟棄。

分析:偶發(fā)性的、周期性的批量操作會(huì)使臨時(shí)數(shù)據(jù)涌入緩存,擠出熱點(diǎn)數(shù)據(jù),導(dǎo)致LRU熱點(diǎn)命中率急劇下降,緩存污染情況比較嚴(yán)重。

復(fù)雜度與代價(jià):數(shù)據(jù)結(jié)構(gòu)復(fù)雜度較低;每次需要遍歷鏈表,找到命中的數(shù)據(jù)塊,然后將數(shù)據(jù)移到頭部。

LRU-K算法

LRU-K是基于LRU算法的優(yōu)化版,其中K代表最近訪問(wèn)的次數(shù),從某種意義上,LRU可以看作是LRU-1算法,引入K的意義是為了解決上面所提到的緩存污染問(wèn)題。其核心理念是從“數(shù)據(jù)最近被訪問(wèn)過(guò)1次”蛻變成“數(shù)據(jù)最近被訪問(wèn)過(guò)K次,那么將來(lái)被訪問(wèn)的概率會(huì)更高”。

LRU-K與LRU區(qū)別是,LRU-K多了一個(gè)數(shù)據(jù)訪問(wèn)歷史記錄隊(duì)列(需要注意的是,訪問(wèn)歷史記錄隊(duì)列并不是緩存隊(duì)列,所以是不保存數(shù)據(jù)本身的,只是保存對(duì)數(shù)據(jù)的訪問(wèn)記錄,數(shù)據(jù)此時(shí)依舊在原始存儲(chǔ)中),隊(duì)列中維護(hù)著數(shù)據(jù)被訪問(wèn)的次數(shù)以及時(shí)間戳,只有當(dāng)這個(gè)數(shù)據(jù)被訪問(wèn)的次數(shù)大于等于K值時(shí),才會(huì)從歷史記錄隊(duì)列中刪除,然后把數(shù)據(jù)加入到緩存隊(duì)列中去。

你與解決“緩存污染”只差這篇文章的距離

步驟:

  1. 數(shù)據(jù)第一次被訪問(wèn)時(shí),加入到歷史訪問(wèn)記錄隊(duì)列中,訪問(wèn)次數(shù)為1,初始化訪問(wèn)時(shí)間戳;

  2. 如果數(shù)據(jù)訪問(wèn)次數(shù)沒(méi)有達(dá)到K次,則訪問(wèn)次數(shù)+1,更新時(shí)間戳。當(dāng)隊(duì)列滿了時(shí),按照某種規(guī)則(LRU或者FIFO)將歷史記錄淘汰。為了避免歷史數(shù)據(jù)污染未來(lái)數(shù)據(jù)的問(wèn)題,還需要加上一個(gè)有效期限,對(duì)超過(guò)有效期的訪問(wèn)記錄,進(jìn)行重新計(jì)數(shù)。(可以使用懶處理,即每次對(duì)訪問(wèn)記錄做處理時(shí),先將記錄中的訪問(wèn)時(shí)間與當(dāng)前時(shí)間進(jìn)行對(duì)比,如果時(shí)間間隔超過(guò)預(yù)設(shè)的值,則訪問(wèn)次數(shù)重置為1并更新時(shí)間戳,表示重新開(kāi)始計(jì)數(shù))

  3. 當(dāng)數(shù)據(jù)訪問(wèn)計(jì)數(shù)大于等于K次后,將數(shù)據(jù)從歷史訪問(wèn)隊(duì)列中刪除,更新數(shù)據(jù)時(shí)間戳,保存到緩存隊(duì)列頭部中(緩存隊(duì)列時(shí)間戳遞減排序,越到尾部距離當(dāng)前時(shí)間越長(zhǎng));

  4. 緩存隊(duì)列中數(shù)據(jù)被再次訪問(wèn)后,將其移到頭部,并更新時(shí)間戳;

  5. 緩存隊(duì)列需要淘汰數(shù)據(jù)時(shí),淘汰緩存隊(duì)列中排在末尾的數(shù)據(jù),即:淘汰“倒數(shù)第K次訪問(wèn)離現(xiàn)在最久”的數(shù)據(jù)。

分析:LRU-K降低了“緩存污染”帶來(lái)的問(wèn)題,命中率比LRU要高。實(shí)際應(yīng)用中LRU-2是綜合各種因素后最優(yōu)的選擇,LRU-3或者更大的K值命中率會(huì)高,但適應(yīng)性差,一旦訪問(wèn)模式發(fā)生變化,需要大量的新數(shù)據(jù)訪問(wèn)才能將歷史熱點(diǎn)訪問(wèn)記錄清除掉。

復(fù)雜度與代價(jià):LRU-K隊(duì)列是一個(gè)優(yōu)先級(jí)隊(duì)列。由于LRU-K需要記錄那些被訪問(wèn)過(guò),但還沒(méi)有放入緩存的對(duì)象,導(dǎo)致內(nèi)存消耗會(huì)很多。

URL-Two queues算法

URL-Two queues算法類(lèi)似于LRU-2,不同點(diǎn)在于URL-Two queues將LRU-2算法中的訪問(wèn)歷史隊(duì)列(注意這不是緩存數(shù)據(jù)的)改為一個(gè)FIFO緩存隊(duì)列,即:URL-Two queues算法有兩個(gè)緩存隊(duì)列,一個(gè)是FIFO隊(duì)列(First in First out,先進(jìn)先出),一個(gè)是LRU隊(duì)列。

當(dāng)數(shù)據(jù)第一次訪問(wèn)時(shí),URL-Two queues算法將數(shù)據(jù)緩存在FIFO隊(duì)列里面,當(dāng)數(shù)據(jù)第二次被訪問(wèn)時(shí),則將數(shù)據(jù)從FIFO隊(duì)列移到LRU隊(duì)列里面,兩個(gè)隊(duì)列各自按照自己的方法淘汰數(shù)據(jù)。

你與解決“緩存污染”只差這篇文章的距離

步驟:

  1. 新訪問(wèn)的數(shù)據(jù)先插入到FIFO隊(duì)列中;

  2. 如果數(shù)據(jù)在FIFO隊(duì)列中一直沒(méi)有被再次訪問(wèn),則最終按照FIFO規(guī)則淘汰;

  3. 如果數(shù)據(jù)在FIFO隊(duì)列中被再次訪問(wèn),則將數(shù)據(jù)從FIFO刪除,加入到LRU隊(duì)列頭部;

  4. 如果數(shù)據(jù)在LRU隊(duì)列再次被訪問(wèn),則將數(shù)據(jù)移到LRU隊(duì)列頭部;

  5. LRU隊(duì)列淘汰末尾的數(shù)據(jù)。

分析:URL-Two queues算法和LRU-2算法命中率類(lèi)似,但是URL-Two queues會(huì)減少一次從原始存儲(chǔ)讀取或計(jì)算數(shù)據(jù)的操作。命中率要高于LRU。

復(fù)雜度與代價(jià):需要維護(hù)兩個(gè)隊(duì)列,代價(jià)是FIFO和LRU代價(jià)之和。

五三LRU算法

emmmm...

這個(gè)名字其實(shí)是我取的,大概是這種算法還沒(méi)有被命名?當(dāng)然,這是一個(gè)玩笑話。

我是在MySQL底層實(shí)現(xiàn)里發(fā)現(xiàn)這個(gè)算法的,mysql在處理緩存淘汰時(shí)是用的這個(gè)方法,有點(diǎn)像URL-Two queues的變體,只是我們只需要維護(hù)一個(gè)隊(duì)列,然后將隊(duì)列按照5:3的比例進(jìn)行分割,5的那部分叫做young區(qū),3的那部分叫做old區(qū)。具體是怎么樣的請(qǐng)先看我把圖畫(huà)出來(lái):

你與解決“緩存污染”只差這篇文章的距離

步驟:

  1. 第一次訪問(wèn)的數(shù)據(jù)從隊(duì)列的3/8處位置插入;

  2. 如果數(shù)據(jù)再次被訪問(wèn),則移動(dòng)到隊(duì)列頭部;

  3. 如果數(shù)據(jù)沒(méi)有被再訪問(wèn),會(huì)逐步被熱點(diǎn)數(shù)據(jù)驅(qū)逐向下移;

  4. 淘汰尾部數(shù)據(jù)。

分析:五三LRU算法算作是URL-Two queues算法的變種,原理其實(shí)是一樣的,只是把兩個(gè)隊(duì)列合二為一個(gè)隊(duì)列進(jìn)行數(shù)據(jù)的處理,所以命中率和URL-Two queues算法一樣。

復(fù)雜度與代價(jià):維護(hù)一個(gè)隊(duì)列,代價(jià)較低,但是內(nèi)存占用率和URL-Two queues一樣。

Multi Queue算法

Multi Queue算法根據(jù)訪問(wèn)頻率將數(shù)據(jù)劃分為多個(gè)隊(duì)列,不同的隊(duì)列具有不同的訪問(wèn)優(yōu)先級(jí),其核心思想是“優(yōu)先緩存訪問(wèn)次數(shù)多的數(shù)據(jù)”。

Multi Queue算法將緩存劃分為多個(gè)LRU隊(duì)列,每個(gè)隊(duì)列對(duì)應(yīng)不同的訪問(wèn)優(yōu)先級(jí)。訪問(wèn)優(yōu)先級(jí)是根據(jù)訪問(wèn)次數(shù)計(jì)算出來(lái)的,例如: Q0,Q1....Qn代表不同的優(yōu)先級(jí)隊(duì)列,Q-history代表從緩存中淘汰數(shù)據(jù),但記錄了數(shù)據(jù)的索引和引用次數(shù)。

你與解決“緩存污染”只差這篇文章的距離

步驟:

  1. 新插入的數(shù)據(jù)放入Q0;

  2. 每個(gè)隊(duì)列按照LRU管理數(shù)據(jù),再次訪問(wèn)的數(shù)據(jù)移動(dòng)到頭部;

  3. 當(dāng)數(shù)據(jù)的訪問(wèn)次數(shù)達(dá)到一定次數(shù),需要提升優(yōu)先級(jí)時(shí),將數(shù)據(jù)從當(dāng)前隊(duì)列刪除,加入到高一級(jí)隊(duì)列的頭部;

  4. 為了防止高優(yōu)先級(jí)數(shù)據(jù)永遠(yuǎn)不被淘汰,當(dāng)數(shù)據(jù)在指定的時(shí)間里訪問(wèn)沒(méi)有被訪問(wèn)時(shí),需要降低優(yōu)先級(jí),將數(shù)據(jù)從當(dāng)前隊(duì)列刪除,加入到低一級(jí)的隊(duì)列頭部;

  5. 需要淘汰數(shù)據(jù)時(shí),從最低一級(jí)隊(duì)列開(kāi)始按照LRU淘汰;每個(gè)隊(duì)列淘汰數(shù)據(jù)時(shí),將數(shù)據(jù)從緩存中刪除,將數(shù)據(jù)索引加入Q-history頭部;

  6. 如果數(shù)據(jù)在Q-history中被重新訪問(wèn),則重新計(jì)算其優(yōu)先級(jí),移到目標(biāo)隊(duì)列的頭部;

  7. Q-history按照LRU淘汰數(shù)據(jù)的索引。

分析:Multi Queue降低了“緩存污染”帶來(lái)的問(wèn)題,命中率比LRU要高。

復(fù)雜度與代價(jià):Multi Queue需要維護(hù)多個(gè)隊(duì)列,且需要維護(hù)每個(gè)數(shù)據(jù)的訪問(wèn)時(shí)間,復(fù)雜度比LRU高。Multi Queue需要記錄每個(gè)數(shù)據(jù)的訪問(wèn)時(shí)間,需要定時(shí)掃描所有隊(duì)列,代價(jià)比LRU要高。雖然Multi Queue的隊(duì)列看起來(lái)數(shù)量比較多,但由于所有隊(duì)列之和受限于緩存容量的大小,因此這里多個(gè)隊(duì)列長(zhǎng)度之和和一個(gè)LRU隊(duì)列是一樣的,因此隊(duì)列掃描性能也相近。


標(biāo)題名稱:你與解決“緩存污染”只差這篇文章的距離
網(wǎng)頁(yè)路徑:http://weahome.cn/article/pooeoh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部