19 MySQL是如何將LRU鏈表的使用性能優(yōu)化到極致的?

MySQL是如何將LRU鏈表的使用性能優(yōu)化到極致的?
1、昨日第一個(gè)思考題的解答
昨天第一個(gè)思考題,我們是讓大家思考一下,在LRU鏈表的冷數(shù)據(jù)區(qū)域中的都是什么樣的數(shù)據(jù)呢?
其實(shí)大家腦筋一轉(zhuǎn)就知道了,大部分應(yīng)該都是預(yù)讀加載進(jìn)來(lái)的緩存頁(yè),加載進(jìn)來(lái)1s之后都沒(méi)人訪(fǎng)問(wèn)的,然后包括全表掃描或者一些大的查詢(xún)語(yǔ)句,加載一堆數(shù)據(jù)到緩存頁(yè),結(jié)果都是1s之內(nèi)訪(fǎng)問(wèn)了一下,后續(xù)就不再訪(fǎng)問(wèn)這些表的數(shù)據(jù)了。
類(lèi)似這些數(shù)據(jù),統(tǒng)統(tǒng)都會(huì)放在冷數(shù)據(jù)區(qū)域里。
2、昨日第二個(gè)思考題的解答
接著我們來(lái)說(shuō)一下昨日第二個(gè)思考題的解答,昨天第二個(gè)思考題是讓大家想了一下,對(duì)于我們開(kāi)發(fā)的Java系統(tǒng),如果在Redis里存放了很多緩存數(shù)據(jù),那么此時(shí)會(huì)不會(huì)有類(lèi)似冷熱數(shù)據(jù)的問(wèn)題?應(yīng)該如何優(yōu)化和解決呢?
答案是:那必然是存在一些問(wèn)題的。
常見(jiàn)的一個(gè)場(chǎng)景就是電商系統(tǒng)里的商品緩存數(shù)據(jù),假設(shè)你有1億個(gè)商品,然后只要查詢(xún)商品的時(shí)候發(fā)現(xiàn)商品不在緩存里,就給他放到緩存里去,你要這么搞的話(huà),必然導(dǎo)致大量的不怎么經(jīng)常訪(fǎng)問(wèn)的商品會(huì)被放在Redis緩存里!
經(jīng)常被訪(fǎng)問(wèn)的商品其實(shí)就是熱數(shù)據(jù),不經(jīng)常被訪(fǎng)問(wèn)的商品其實(shí)就是冷數(shù)據(jù),我們應(yīng)該盡量讓Redis里放的都是經(jīng)常訪(fǎng)問(wèn)的熱數(shù)據(jù),而不是大量的冷數(shù)據(jù)。因?yàn)槟惴乓淮蠖巡辉趺唇?jīng)常訪(fǎng)問(wèn)的商品在Redis里,那么他占用了很多內(nèi)存,而且后續(xù)還不怎么會(huì)訪(fǎng)問(wèn)到他們!
所以我們?cè)谠O(shè)計(jì)緩存機(jī)制的時(shí)候,經(jīng)常會(huì)考慮熱數(shù)據(jù)的緩存預(yù)加載
也就是說(shuō),每天統(tǒng)計(jì)出來(lái)哪些商品被訪(fǎng)問(wèn)的次數(shù)最多,然后晚上的時(shí)候,系統(tǒng)啟動(dòng)一個(gè)定時(shí)作業(yè),把這些熱門(mén)商品的數(shù)據(jù),預(yù)加載到Redis里。那么第二天是不是對(duì)熱門(mén)商品的訪(fǎng)問(wèn)就自然會(huì)優(yōu)先走Redis緩存了?
3、LRU鏈表的熱數(shù)據(jù)區(qū)域是如何進(jìn)行優(yōu)化的?
接著我們來(lái)看看LRU鏈表的熱數(shù)據(jù)區(qū)域的一個(gè)性能優(yōu)化的點(diǎn),就是說(shuō),在熱數(shù)據(jù)區(qū)域中,如果你訪(fǎng)問(wèn)了一個(gè)緩存頁(yè),是不是應(yīng)該要把他立馬移動(dòng)到熱數(shù)據(jù)區(qū)域的鏈表頭部去?
我們看下面的圖示。
? ? ? ? ? ?

? ? ? ? ? ? ?
但是你要知道,熱數(shù)據(jù)區(qū)域里的緩存頁(yè)可能是經(jīng)常被訪(fǎng)問(wèn)的,所以這么頻繁的進(jìn)行移動(dòng)是不是性能也并不是太好?也沒(méi)這個(gè)必要。
所以說(shuō),LRU鏈表的熱數(shù)據(jù)區(qū)域的訪(fǎng)問(wèn)規(guī)則被優(yōu)化了一下,即你只有在熱數(shù)據(jù)區(qū)域的后3/4部分的緩存頁(yè)被訪(fǎng)問(wèn)了,才會(huì)給你移動(dòng)到鏈表頭部去。
如果你是熱數(shù)據(jù)區(qū)域的前面1/4的緩存頁(yè)被訪(fǎng)問(wèn),他是不會(huì)移動(dòng)到鏈表頭部去的。
舉個(gè)例子,假設(shè)熱數(shù)據(jù)區(qū)域的鏈表里有100個(gè)緩存頁(yè),那么排在前面的25個(gè)緩存頁(yè),他即使被訪(fǎng)問(wèn)了,也不會(huì)移動(dòng)到鏈表頭部去的。但是對(duì)于排在后面的75個(gè)緩存頁(yè),他只要被訪(fǎng)問(wèn),就會(huì)移動(dòng)到鏈表頭部去。
這樣的話(huà),他就可以盡可能的減少鏈表中的節(jié)點(diǎn)移動(dòng)了。
4、一個(gè)腦筋急轉(zhuǎn)彎的思考題
今天給大家出一個(gè)腦筋急轉(zhuǎn)彎的小思考題,大家看了以后都可以在評(píng)論區(qū)里回答一下,如果回答錯(cuò)誤的同學(xué),那真的得接受一點(diǎn)懲罰了!
這個(gè)問(wèn)題就是:如果一個(gè)緩存頁(yè)在冷數(shù)據(jù)區(qū)域的尾巴上,已經(jīng)超過(guò)1s了,此時(shí)這個(gè)緩存頁(yè)被訪(fǎng)問(wèn)了一下,那么他此時(shí)會(huì)移動(dòng)到冷數(shù)據(jù)區(qū)域的鏈表頭部嗎?注意,是冷數(shù)據(jù)區(qū)域的鏈表頭部!
End
專(zhuān)欄版權(quán)歸公眾號(hào)儒猿技術(shù)窩所有
未經(jīng)許可不得傳播,如有侵權(quán)將追究法律責(zé)任