淺談緩存寫法(二):多級(jí)緩存、分布式緩存

緩存預(yù)熱

上次有同學(xué)問(wèn)過(guò),在第一次加載時(shí)緩存都為空,怎么進(jìn)行預(yù)熱。

十余年的白河網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。網(wǎng)絡(luò)營(yíng)銷推廣的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整白河建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)公司從事“白河網(wǎng)站設(shè)計(jì)”,“白河網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

單機(jī)Web情況下一般使用RunTimeCache,這種情況下:

可以在啟動(dòng)事件里面刷新

<pre style="margin:0px;
    padding:0px;
    white-space:pre-wrap;
    overflow-wrap:break-word;
    font-family:"
    Courier New"
    !important;
    font-size:12px !important;
    ">void Application_Start(object sender,EventArgs e) {
    //刷新
}
</pre>

另外可以單寫個(gè)刷新緩存頁(yè)面,上線后手動(dòng)刷新下或發(fā)布時(shí)自動(dòng)調(diào)用刷新,再或者由用戶自行觸發(fā)。

分布式緩存(redis、Memcached)情況下:

比如在幾十臺(tái)服務(wù)器緩存時(shí),單刷滿緩存都需要不少一段時(shí)間。

這種預(yù)熱就復(fù)雜一些,有的會(huì)單寫個(gè)應(yīng)用程序去跑,也有的會(huì)單寫套框架機(jī)制去處理(更智能化)。

其目的是在系統(tǒng)上線之前,所有的緩存都預(yù)先加載完畢。

多級(jí)緩存

計(jì)算機(jī)結(jié)構(gòu)中CPU和內(nèi)存之間一般都配有一級(jí)緩存、二級(jí)緩存來(lái)增加交換速度。

這樣當(dāng)CPU調(diào)用大量數(shù)據(jù)時(shí),就可避開內(nèi)存直接從CPU緩存中調(diào)用,加快讀取速度。

根據(jù)CPU緩存得出多級(jí)緩存的特點(diǎn):

? 1:每一級(jí)緩存中儲(chǔ)存的是下一級(jí)緩存的一部分。

? 2:讀取速度按級(jí)別依次遞減,成本也依次遞減,容量依次遞增。

? 3:當(dāng)前級(jí)別未命中時(shí),才會(huì)去下一級(jí)尋找。

而在企業(yè)應(yīng)用級(jí)開發(fā)中,使用多級(jí)緩存是同樣的目的及設(shè)計(jì),只是粒度更粗,更靈活。

根據(jù)速度依次排列l(wèi)v1-lv6的緩存類型圖:

淺談緩存寫法(二):多級(jí)緩存、分布式緩存

?3級(jí)緩存的命中流程圖例子:

淺談緩存寫法(二):多級(jí)緩存、分布式緩存

線程緩存

Web應(yīng)用是天生的多線程開發(fā),對(duì)于一些公共資源必須考慮線程安全,為止不得不通過(guò)鎖來(lái)保證數(shù)據(jù)的完整性和正確性。

在實(shí)際當(dāng)中一臺(tái)web服務(wù)器至少也得處理成百上千的請(qǐng)求,想一想在業(yè)務(wù)復(fù)雜的處理流程,函數(shù)每調(diào)用一次都得鎖一下,對(duì)服務(wù)器也是個(gè)不小的浪費(fèi)。

而通過(guò)線程緩存,可以讓當(dāng)前處理用戶請(qǐng)求的線程只拿自己需要的數(shù)據(jù)。

<pre style="margin: 0px; 
            padding: 0px; 
            white-space: pre-wrap;
            overflow-wrap: break-word; 
            font-family: "
            Courier New" 
            !important; 
            font-size: 12px !important;"
>
public static ThreadLocal<UserScore> localUserInfo = new ThreadLocal<UserScore>();
</pre>

借助Net提供的線程本地變量,可以在請(qǐng)求入口去拉取當(dāng)前用戶的數(shù)據(jù)。

在之后線程整個(gè)生命周期里面,業(yè)務(wù)邏輯可以毫無(wú)顧慮的使用這些數(shù)據(jù),而不需要考慮線程安全。

因?yàn)椴挥弥匦履眯戮彺鏀?shù)據(jù),所以也不用擔(dān)心數(shù)據(jù)撕裂的問(wèn)題。

其當(dāng)前線程周期里面的數(shù)據(jù)是完整無(wú)誤的,只有用戶第二次發(fā)起請(qǐng)求才會(huì)重新去拿新數(shù)據(jù)。

這樣就能提高不少服務(wù)器吞吐量,注意要在線程的出口處銷毀數(shù)據(jù)。

內(nèi)存緩存

無(wú)論是遠(yuǎn)程數(shù)據(jù)庫(kù)讀取,還是緩存服務(wù)器讀取。避免不了要跨進(jìn)程,跨網(wǎng)絡(luò)通信,有的還跨機(jī)房。

而應(yīng)用程序頻繁讀寫,對(duì)Web、DB服務(wù)器都是個(gè)不小的消耗,速度相較內(nèi)存也慢的多。

代碼上加鎖、異步,甚至加服務(wù)器在內(nèi),都不是一個(gè)很好的辦法。因?yàn)榧虞d速度,對(duì)用戶體驗(yàn)非常重要。


?所以在有要求的項(xiàng)目中使用本地內(nèi)存做二級(jí)緩存,是非常有必要的。目的就是1:抗并發(fā),2:加快讀取速度。

有個(gè)著名的緩存五分鐘法則法則,就是說(shuō)如果一個(gè)數(shù)據(jù)頻繁被訪問(wèn),那么就應(yīng)該放內(nèi)存中。

舉個(gè)例子:??有100并發(fā)過(guò)來(lái),加鎖會(huì)導(dǎo)致前端99線程等候,這個(gè)99線程等候著,其實(shí)是一直在消耗Web服務(wù)器資源。不加就是緩存雪崩。

如果每分鐘拉取一份緩存,緩存到內(nèi)存,這樣99線程等候時(shí)間極大縮短。?

文件緩存

相對(duì)于內(nèi)存,硬盤容量大,速度相較于走網(wǎng)絡(luò)還更快。

所以我們完全可以把一些不經(jīng)常變更,放在內(nèi)存又比較浪費(fèi)的數(shù)據(jù)緩存到本地硬盤。

比如使用sqlite一些文件數(shù)據(jù)庫(kù),我們很容易做到。

分布式緩存

基于內(nèi)存緩存的redis、memcached等。

基于文件NOSQL的Casssandra、MongoDB等。

redis、memcached是主流的分布式內(nèi)存緩存,也是應(yīng)用和DB中間最大的緩存層。

nosql這類的其實(shí)不單單只是做緩存用了,完全用在一些非核心業(yè)務(wù)的DB層了。

DB緩存

這一層DB主要是緩存由原始數(shù)據(jù)計(jì)算出的結(jié)果,從而避免由Web程序通過(guò)SQL或在使用中直接計(jì)算。

當(dāng)然也可以把計(jì)算好的數(shù)據(jù),存儲(chǔ)到redis中當(dāng)緩存。

淺談緩存寫法(二):多級(jí)緩存、分布式緩存

多層緩存

多層緩存概念在很多地方都用到過(guò):

1:上面介紹的多級(jí)緩存就是一種,把內(nèi)容根據(jù)讀取頻率,分不同的等級(jí)、不同的層次進(jìn)行存儲(chǔ),頻率越高離查詢?cè)浇?/p>

2:還一種多層是緩存索引的做法,類似B樹查找,這樣能提高檢索效率。

3:從架構(gòu)上來(lái)說(shuō)瀏覽器緩存、cdn緩存、反向代理緩存、服務(wù)端緩存、也是多層緩存。

總結(jié)

在使用上大家根據(jù)實(shí)際場(chǎng)景,進(jìn)行各種組合搭配。本篇談的比較理論些,有些內(nèi)容細(xì)節(jié)沒(méi)展開。

比如分布式緩存的使用,緩存置換策略及算法,緩存過(guò)期機(jī)制等。


文末彩蛋

針對(duì)于上面所涉及到的知識(shí)點(diǎn)我總結(jié)出了有1到5年開發(fā)經(jīng)驗(yàn)的程序員在面試中涉及到的絕大部分架構(gòu)面試題及答案做成了文檔和架構(gòu)視頻資料免費(fèi)分享給大家(包括Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并發(fā)等架構(gòu)技術(shù)資料),希望能幫助到您面試前的復(fù)習(xí)且找到一個(gè)好的工作,也節(jié)省大家在網(wǎng)上搜索資料的時(shí)間來(lái)學(xué)習(xí),也可以關(guān)注我一下以后會(huì)有更多干貨分享。

資料獲取方式 QQ群搜索“708-701-457” 即可免費(fèi)領(lǐng)取

淺談緩存寫法(二):多級(jí)緩存、分布式緩存
淺談緩存寫法(二):多級(jí)緩存、分布式緩存
淺談緩存寫法(二):多級(jí)緩存、分布式緩存

新聞標(biāo)題:淺談緩存寫法(二):多級(jí)緩存、分布式緩存
網(wǎng)頁(yè)地址:http://bm7419.com/article12/jccpdc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營(yíng)銷、虛擬主機(jī)、外貿(mào)網(wǎng)站建設(shè)、電子商務(wù)、小程序開發(fā)、網(wǎng)站維護(hù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化