上次主要討論緩存讀寫這塊各種代碼實現(xiàn),。本篇是就上次的問題接著來,,繼續(xù)看那些年我們各種緩存用法。 一:緩存預熱上次有同學問過,。在第一次加載時,,我們的緩存都為空,怎么進行預熱,。 單機Web情況下,,一般我們使用RunTimeCache。相對于這種情況下:1:我們可以在啟動事件里面刷新
2:單寫個刷新緩存頁面,,上線后手動刷新下,、或發(fā)布時自動調用刷新、或干脆由用戶自行觸發(fā),。 分布式緩存(Redis,、memcached)情況下:比如:在幾十臺服務器緩存時,單刷滿緩存都需要不少一段時間。 這種預熱就復雜一些,,有的會單寫個應用程序去跑,,也有的會單寫套框架機制去處理(更智能化)。 目的都是在上線之前:所有的緩存都預先加載完畢,。 二:多級緩存2.1 介紹我們曉得在CPU和內(nèi)存之間一般都配有一級緩存,、二級緩存來增加交換速度。 這樣當CPU調用大量數(shù)據(jù)時,,就可避開內(nèi)存直接從CPU緩存中調用,,加快讀取速度。 根據(jù)CPU緩存得出多級緩存的特點: 1:每一級緩存中儲存的是下一級緩存的一部分,。 2:讀取速度按級別依次遞減,,成本也依次遞減,容量依次遞增,。 3:當前級別未命中時,,才會去下一級尋找。 而在企業(yè)應用級開發(fā)中,,使用多級緩存是同樣的目的及設計,,只是粒度更粗,更靈活,。 根據(jù)速度依次排列l(wèi)v1-lv6的緩存類型圖: 3級緩存的命中流程圖例子: 2.2 線程緩存Web應用是天生的多線程開發(fā),。對于一些公共資源我們必須考慮線程安全,為止我們不得不通過鎖來保證數(shù)據(jù)的完整性和正確性,。 在實際當中,,一臺web服務器至少也得處理成百上千的請求。想一想,,在業(yè)務復雜的處理流程,,函數(shù)每調用一次我們都得鎖一下。 對服務器也是個不小的浪費,。而通過線程緩存,,可以讓當前處理用戶請求的線程只拿自己需要的。
借助Net提供的線程本地變量,,我們可以在請求入口去拉取當前用戶的數(shù)據(jù),。 在之后線程整個生命周期里面,我們的業(yè)務邏輯可以毫無顧慮的使用這些數(shù)據(jù),,不需要考慮線程安全,。 而且我們不用重新拿新數(shù)據(jù),所以也不用擔心數(shù)據(jù)撕裂的問題,。 因為當前線程周期里面的數(shù)據(jù)是完整無誤的,,而只有用戶第二次發(fā)起請求才會重新去拿新數(shù)據(jù),。 這樣就能提高不少我們服務器吞吐量。注意要在線程出口銷毀數(shù)據(jù),。 2.3 內(nèi)存緩存無論是遠程數(shù)據(jù)庫讀取,,還是緩存服務器讀取。避免不了要跨進程,,跨網(wǎng)絡通信,,有的還跨機房。 而應用程序頻繁讀寫,,對Web,、DB服務器都是個不小的消耗,速度相較內(nèi)存也慢的多,。 代碼上加鎖,、異步,甚至加服務器在內(nèi),,都不是一個很好的辦法,。因為加載速度,對用戶體驗非常重要,。 所以在有要求的項目中使用本地內(nèi)存做二級緩存,,是非常有必要的。目的就是1:抗并發(fā),,2:加快讀取速度,。 有個著名的緩存五分鐘法則法則,就是說如果一個數(shù)據(jù)頻繁被訪問,,那么就應該放內(nèi)存中,。 舉個例子: 有100并發(fā)過來,加鎖會導致前端99線程等候,,這個99線程等候著,,其實是一直在消耗Web服務器資源。不加就是緩存雪崩,。 如果我們每分鐘拉取一份緩存,緩存到內(nèi)存,,這樣99線程等候時間極大縮短,。 2.4 文件緩存相對于內(nèi)存,硬盤容量大,,速度相較于走網(wǎng)絡還更快,。 所以我們完全可以把一些不經(jīng)常變更,放在內(nèi)存又比較浪費的數(shù)據(jù)緩存到本地硬盤,。 比如使用sqlite一些文件數(shù)據(jù)庫,,我們很容易做到,。 2.5 分布式緩存基于內(nèi)存緩存的redis、memcached等,。 基于文件nosql的Casssandra,、mongodb等。 redis,、memcached是主流的分布式內(nèi)存緩存,,也是應用和DB中間最大的緩存層。 nosql這類的其實不單單只是做緩存用了,,完全用在一些非核心業(yè)務的DB層了,。 2.6 DB緩存這一層DB主要是緩存由原始數(shù)據(jù)計算出的結果。而避免由Web程序通過SQL或在使用中直接計算,。 當然我們也可以把計算好的數(shù)據(jù),,存儲到redis做緩存。 三:多層緩存多層緩存概念在很多地方都用到過: 1:上面我們說的多級緩存就是一種,,把內(nèi)容根據(jù)讀取頻率等級,,分不同的層次存儲,頻率越高就越近,。 2:還一種多層是緩存索引的做法,,類B樹查找,這樣能提高檢索效率,。 3:從架構上來說客戶端緩存,,CDN緩存,反向代理緩存,,服務端緩存,,也是多層緩存。 四:總結在使用上,,大家根據(jù)實際場景,,進行各種組合搭配。本篇談的比較理論些,,很多內(nèi)容細節(jié)沒展開,。 比如分布式緩存使用,緩存置換策略及算法,,緩存過期機制等,。后面樓主會繼續(xù)補充下去。 |
|
來自: codingparty > 《緩存》