18 基于冷熱數(shù)據(jù)分離方案優(yōu)化后的LRU鏈表,是如何解決之前的問題的?

基于冷熱數(shù)據(jù)分離方案優(yōu)化后的LRU鏈表,是如何解決之前的問題的?
1、對于預(yù)讀以及全表掃描加載進(jìn)來的一大堆緩存頁
現(xiàn)在我們已經(jīng)看完了LRU鏈表的冷熱數(shù)據(jù)分離的方案,那么我們接著看這個(gè)冷熱數(shù)據(jù)分離之后的LRU鏈表,他是如何解決之前遇到的一大堆問題的?
首先我們思考一下,在這樣的一個(gè)LRU鏈表方案下,預(yù)讀機(jī)制以及全表掃描加載進(jìn)來的一大堆緩存頁,他們會(huì)放在哪里?
明顯是放在LRU鏈表的冷數(shù)據(jù)區(qū)域的前面?。?/p>
假設(shè)這個(gè)時(shí)候熱數(shù)據(jù)區(qū)域已經(jīng)有很多被頻繁訪問的緩存頁了,你會(huì)發(fā)現(xiàn)熱數(shù)據(jù)區(qū)域還是存放被頻繁訪問的緩存頁的,只要熱數(shù)據(jù)區(qū)域有緩存頁被訪問,他還是會(huì)被移動(dòng)到熱數(shù)據(jù)區(qū)域的鏈表頭部去。
所以此時(shí)你看下圖,你會(huì)發(fā)現(xiàn),預(yù)讀機(jī)制和全表掃描加載進(jìn)來的一大堆緩存頁,此時(shí)都在冷數(shù)據(jù)區(qū)域里,跟熱數(shù)據(jù)區(qū)域里的頻繁訪問的緩存頁,是沒關(guān)系的!
? ? ? ? ? ?

?
2、預(yù)讀機(jī)制和全表掃描加載進(jìn)來的緩存頁,能進(jìn)熱數(shù)據(jù)區(qū)域嗎?
接著我們看第二個(gè)問題,預(yù)讀機(jī)制和全表掃描機(jī)制加載進(jìn)來的緩存頁,什么時(shí)候能進(jìn)熱數(shù)據(jù)區(qū)域呢?
如果你僅僅是一個(gè)全表掃描的查詢,此時(shí)你肯定是在1s內(nèi)就把一大堆緩存頁加載進(jìn)來,然后就訪問了這些緩存頁一下,通常這些操作1s內(nèi)就結(jié)束了。
所以基于目前的一個(gè)機(jī)制,可以確定的是,這種情況下,那些緩存頁是不會(huì)從冷數(shù)據(jù)區(qū)域轉(zhuǎn)移到熱數(shù)據(jù)區(qū)域的!
除非你在冷數(shù)據(jù)區(qū)域里的緩存頁,在1s之后還被人訪問了,那么此時(shí)他們就會(huì)判定為未來可能會(huì)被頻繁訪問的緩存頁,然后移動(dòng)到熱數(shù)據(jù)區(qū)域的鏈表頭部去!
3、如果此時(shí)緩存頁不夠了,需要淘汰一些緩存,會(huì)怎么樣?
接著我們看,假設(shè)此時(shí)緩存頁不夠了,需要淘汰一些緩存頁,此時(shí)會(huì)怎么做?
那就很簡單了,直接就是可以找到LRU鏈表中的冷數(shù)據(jù)區(qū)域的尾部的緩存頁,他們肯定是之前被加載進(jìn)來的,而且加載進(jìn)來1s過后都沒人訪問過,說明這個(gè)緩存頁壓根兒就沒人愿意去訪問他!他就是冷數(shù)據(jù)!
所以此時(shí)就直接淘汰冷數(shù)據(jù)區(qū)域的尾部的緩存頁,刷入磁盤,就可以了,我們看下圖。

? ? ? ? ? ?
4、之前的一大堆問題解決了嗎?
在這樣的一套緩存頁分冷熱數(shù)據(jù)的加載方案,以及冷數(shù)據(jù)轉(zhuǎn)化為熱數(shù)據(jù)的時(shí)間限制方案,還有就是淘汰緩存頁的時(shí)候優(yōu)先淘汰冷數(shù)據(jù)區(qū)域的方案,基于這套方案,大家會(huì)發(fā)現(xiàn),之前發(fā)現(xiàn)的問題,完美的被解決了。
因?yàn)槟欠N預(yù)讀機(jī)制以及全表掃描機(jī)制加載進(jìn)來的數(shù)據(jù)頁,大部分都會(huì)在1s之內(nèi)訪問一下,之后可能就再也不訪問了,所以這種緩存頁基本上都會(huì)留在冷數(shù)據(jù)區(qū)域里。然后頻繁訪問的緩存頁還是會(huì)留在熱數(shù)據(jù)區(qū)域里。
當(dāng)你要淘汰緩存的時(shí)候,優(yōu)先就是會(huì)選擇冷數(shù)據(jù)區(qū)域的尾部的緩存頁,這就是非常合理的了!他不會(huì)讓剛加載進(jìn)來的緩存頁占據(jù)LRU鏈表的頭部,頻繁訪問的緩存頁在LRU鏈表的尾部,淘汰的時(shí)候淘汰尾部的頻繁訪問的緩存頁了!
問題完美的被解決了。
這就是LRU鏈表冷熱數(shù)據(jù)分離的一套機(jī)制。
5、總結(jié)
通過這幾篇文章的學(xué)習(xí),我們已經(jīng)徹底搞定了LRU鏈表的設(shè)計(jì)機(jī)制,剛加載數(shù)據(jù)的緩存頁都是放冷數(shù)據(jù)區(qū)域的頭部的,1s過后被訪問了才會(huì)放熱數(shù)據(jù)區(qū)域的頭部,熱數(shù)據(jù)區(qū)域的緩存頁被訪問了,就會(huì)自動(dòng)放到頭部去。
這樣的話,實(shí)際上冷數(shù)據(jù)區(qū)域放的都是加載進(jìn)來的緩存頁,最多在1s內(nèi)被訪問過,之后就再也沒訪問過的冷數(shù)據(jù)緩存頁!
而加載進(jìn)來之后在1s過后還經(jīng)常被訪問的緩存頁,都放在了熱數(shù)據(jù)區(qū)域里,他們進(jìn)行了冷熱數(shù)據(jù)的隔離!
這樣的話,在淘汰緩存的時(shí)候,一定是優(yōu)先淘汰冷數(shù)據(jù)區(qū)域幾乎不怎么被訪問的緩存頁的!也希望大家好好吸收這種冷熱數(shù)據(jù)隔離的思想,盡可能讓熱數(shù)據(jù)和冷數(shù)據(jù)分開,避免冷數(shù)據(jù)影響熱數(shù)據(jù)的訪問!
6、一個(gè)發(fā)散思考問題
今天給大家留一個(gè)發(fā)散思考的問題,大家覺得對于這種緩存中同時(shí)包含冷熱數(shù)據(jù)的場景,如果你是在Redis中放了你業(yè)務(wù)系統(tǒng)的很多緩存數(shù)據(jù),其中也是冷熱數(shù)據(jù)都有的,此時(shí)可能會(huì)有什么問題?
那么針對這樣的一個(gè)問題,你是否可以考慮在你自己的緩存設(shè)計(jì)中,運(yùn)用冷熱隔離的思想來優(yōu)化重構(gòu)呢?
這是一個(gè)非常值得思考的問題,請大家積極思考,在評論區(qū)踴躍發(fā)言
End
專欄版權(quán)歸公眾號(hào)儒猿技術(shù)窩所有
未經(jīng)許可不得傳播,如有侵權(quán)將追究法律責(zé)任