您好,登錄后才能下訂單哦!
上次有同學問過,在第一次加載時緩存都為空,怎么進行預熱。
可以在啟動事件里面刷新
<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>
另外可以單寫個刷新緩存頁面,上線后手動刷新下或發(fā)布時自動調(diào)用刷新,再或者由用戶自行觸發(fā)。
比如在幾十臺服務(wù)器緩存時,單刷滿緩存都需要不少一段時間。
這種預熱就復雜一些,有的會單寫個應用程序去跑,也有的會單寫套框架機制去處理(更智能化)。
其目的是在系統(tǒng)上線之前,所有的緩存都預先加載完畢。
計算機結(jié)構(gòu)中CPU和內(nèi)存之間一般都配有一級緩存、二級緩存來增加交換速度。
這樣當CPU調(diào)用大量數(shù)據(jù)時,就可避開內(nèi)存直接從CPU緩存中調(diào)用,加快讀取速度。
根據(jù)CPU緩存得出多級緩存的特點:
? 1:每一級緩存中儲存的是下一級緩存的一部分。
? 2:讀取速度按級別依次遞減,成本也依次遞減,容量依次遞增。
? 3:當前級別未命中時,才會去下一級尋找。
而在企業(yè)應用級開發(fā)中,使用多級緩存是同樣的目的及設(shè)計,只是粒度更粗,更靈活。
根據(jù)速度依次排列l(wèi)v1-lv6的緩存類型圖:
?3級緩存的命中流程圖例子:
Web應用是天生的多線程開發(fā),對于一些公共資源必須考慮線程安全,為止不得不通過鎖來保證數(shù)據(jù)的完整性和正確性。
在實際當中一臺web服務(wù)器至少也得處理成百上千的請求,想一想在業(yè)務(wù)復雜的處理流程,函數(shù)每調(diào)用一次都得鎖一下,對服務(wù)器也是個不小的浪費。
而通過線程緩存,可以讓當前處理用戶請求的線程只拿自己需要的數(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提供的線程本地變量,可以在請求入口去拉取當前用戶的數(shù)據(jù)。
在之后線程整個生命周期里面,業(yè)務(wù)邏輯可以毫無顧慮的使用這些數(shù)據(jù),而不需要考慮線程安全。
因為不用重新拿新緩存數(shù)據(jù),所以也不用擔心數(shù)據(jù)撕裂的問題。
其當前線程周期里面的數(shù)據(jù)是完整無誤的,只有用戶第二次發(fā)起請求才會重新去拿新數(shù)據(jù)。
這樣就能提高不少服務(wù)器吞吐量,注意要在線程的出口處銷毀數(shù)據(jù)。
無論是遠程數(shù)據(jù)庫讀取,還是緩存服務(wù)器讀取。避免不了要跨進程,跨網(wǎng)絡(luò)通信,有的還跨機房。
而應用程序頻繁讀寫,對Web、DB服務(wù)器都是個不小的消耗,速度相較內(nèi)存也慢的多。
代碼上加鎖、異步,甚至加服務(wù)器在內(nèi),都不是一個很好的辦法。因為加載速度,對用戶體驗非常重要。
?所以在有要求的項目中使用本地內(nèi)存做二級緩存,是非常有必要的。目的就是1:抗并發(fā),2:加快讀取速度。
有個著名的緩存五分鐘法則法則,就是說如果一個數(shù)據(jù)頻繁被訪問,那么就應該放內(nèi)存中。
舉個例子:??有100并發(fā)過來,加鎖會導致前端99線程等候,這個99線程等候著,其實是一直在消耗Web服務(wù)器資源。不加就是緩存雪崩。
如果每分鐘拉取一份緩存,緩存到內(nèi)存,這樣99線程等候時間極大縮短。?
相對于內(nèi)存,硬盤容量大,速度相較于走網(wǎng)絡(luò)還更快。
所以我們完全可以把一些不經(jīng)常變更,放在內(nèi)存又比較浪費的數(shù)據(jù)緩存到本地硬盤。
比如使用sqlite一些文件數(shù)據(jù)庫,我們很容易做到。
基于內(nèi)存緩存的redis、memcached等。
基于文件nosql的Casssandra、mongodb等。
redis、memcached是主流的分布式內(nèi)存緩存,也是應用和DB中間最大的緩存層。
nosql這類的其實不單單只是做緩存用了,完全用在一些非核心業(yè)務(wù)的DB層了。
這一層DB主要是緩存由原始數(shù)據(jù)計算出的結(jié)果,從而避免由Web程序通過SQL或在使用中直接計算。
當然也可以把計算好的數(shù)據(jù),存儲到redis中當緩存。
多層緩存概念在很多地方都用到過:
1:上面介紹的多級緩存就是一種,把內(nèi)容根據(jù)讀取頻率,分不同的等級、不同的層次進行存儲,頻率越高離查詢越近。
2:還一種多層是緩存索引的做法,類似B樹查找,這樣能提高檢索效率。
3:從架構(gòu)上來說瀏覽器緩存、CDN緩存、反向代理緩存、服務(wù)端緩存、也是多層緩存。
在使用上大家根據(jù)實際場景,進行各種組合搭配。本篇談的比較理論些,有些內(nèi)容細節(jié)沒展開。
比如分布式緩存的使用,緩存置換策略及算法,緩存過期機制等。
針對于上面所涉及到的知識點我總結(jié)出了有1到5年開發(fā)經(jīng)驗的程序員在面試中涉及到的絕大部分架構(gòu)面試題及答案做成了文檔和架構(gòu)視頻資料免費分享給大家(包括Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并發(fā)等架構(gòu)技術(shù)資料),希望能幫助到您面試前的復習且找到一個好的工作,也節(jié)省大家在網(wǎng)上搜索資料的時間來學習,也可以關(guān)注我一下以后會有更多干貨分享。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。