那些年咱們一塊兒追過的緩存寫法(二)

感謝園子裏的同窗對上一篇的支持,很高興樓主的一些經驗及想法可以對你們有一些幫助。html

上次主要討論緩存讀寫這塊各類代碼實現,本篇就上次的問題繼續來,看看那些年折騰過的各類緩存作法。web

閱讀目錄:redis

  1. 緩存預熱
  2. 多級緩存
  3. 線程緩存
  4. 內存緩存
  5. 文件緩存
  6. 分佈式緩存
  7. DB緩存
  8. 多層緩存
  9. 總結

緩存預熱

上次有同窗問過,在第一次加載時緩存都爲空,怎麼進行預熱。算法

單機Web狀況下通常使用RunTimeCache,這種狀況下:

能夠在啓動事件裏面刷新sql

void Application_Start(object sender, EventArgs e)
        {
            //刷新
        }

另外能夠單寫個刷新緩存頁面,上線後手動刷新下或發佈時自動調用刷新,再或者由用戶自行觸發。mongodb

分佈式緩存(Redis、Memcached)狀況下:

好比在幾十臺服務器緩存時,單刷滿緩存都須要很多一段時間。數據庫

這種預熱就複雜一些,有的會單寫個應用程序去跑,也有的會單寫套框架機制去處理(更智能化)。瀏覽器

其目的是在系統上線以前,全部的緩存都預先加載完畢。緩存

多級緩存

計算機結構中CPU和內存之間通常都配有一級緩存、二級緩存來增長交換速度。安全

這樣當CPU調用大量數據時,就可避開內存直接從CPU緩存中調用,加快讀取速度。

根據CPU緩存得出多級緩存的特色:

  1:每一級緩存中儲存的是下一級緩存的一部分。

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

  3:當前級別未命中時,纔會去下一級尋找。

而在企業應用級開發中,使用多級緩存是一樣的目的及設計,只是粒度更粗,更靈活。

根據速度依次排列lv1-lv6的緩存類型圖:

 

 3級緩存的命中流程圖例子:

線程緩存

Web應用是天生的多線程開發,對於一些公共資源必須考慮線程安全,爲止不得不經過鎖來保證數據的完整性和正確性。

在實際當中一臺web服務器至少也得處理成百上千的請求,想想在業務複雜的處理流程,函數每調用一次都得鎖一下,對服務器也是個不小的浪費。

而經過線程緩存,能夠讓當前處理用戶請求的線程只拿本身須要的數據

public static ThreadLocal<UserScore> localUserInfo = new ThreadLocal<UserScore>();

藉助Net提供的線程本地變量,能夠在請求入口去拉取當前用戶的數據。

在以後線程整個生命週期裏面,業務邏輯能夠毫無顧慮的使用這些數據,而不須要考慮線程安全。

由於不用從新拿新緩存數據,因此也不用擔心數據撕裂的問題。

其當前線程週期裏面的數據是完整無誤的,只有用戶第二次發起請求才會從新去拿新數據。

這樣就能提升很多服務器吞吐量,注意要在線程的出口處銷燬數據。

內存緩存

不管是遠程數據庫讀取,仍是緩存服務器讀取。避免不了要跨進程,跨網絡通訊,有的還跨機房。

而應用程序頻繁讀寫,對Web、DB服務器都是個不小的消耗,速度相較內存也慢的多。

代碼上加鎖、異步,甚至加服務器在內,都不是一個很好的辦法。由於加載速度,對用戶體驗很是重要。


 因此在有要求的項目中使用本地內存作二級緩存,是很是有必要的。目的就是1:抗併發,2:加快讀取速度。

有個著名的緩存五分鐘法則法則,就是說若是一個數據頻繁被訪問,那麼就應該放內存中。

舉個例子:  有100併發過來,加鎖會致使前端99線程等候,這個99線程等候着,實際上是一直在消耗Web服務器資源。不加就是緩存雪崩。

                若是每分鐘拉取一份緩存,緩存到內存,這樣99線程等候時間極大縮短。 

文件緩存

相對於內存,硬盤容量大,速度相較於走網絡還更快。

因此咱們徹底能夠把一些不常常變動,放在內存又比較浪費的數據緩存到本地硬盤。

好比使用sqlite一些文件數據庫,咱們很容易作到。

分佈式緩存

基於內存緩存的redis、memcached等。

基於文件nosql的Casssandra、mongodb等。

redis、memcached是主流的分佈式內存緩存,也是應用和DB中間最大的緩存層。

nosql這類的其實不僅僅只是作緩存用了,徹底用在一些非核心業務的DB層了。

DB緩存

這一層DB主要是緩存由原始數據計算出的結果,從而避免由Web程序經過SQL或在使用中直接計算。

固然也能夠把計算好的數據,存儲到redis中當緩存。

多層緩存

多層緩存概念在不少地方都用到過:

1:上面介紹的多級緩存就是一種,把內容根據讀取頻率,分不一樣的等級、不一樣的層次進行存儲,頻率越高離查詢越近。

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

3:從架構上來講瀏覽器緩存、CDN緩存、反向代理緩存、服務端緩存、也是多層緩存。

總結

在使用上你們根據實際場景,進行各類組合搭配。本篇談的比較理論些,有些內容細節沒展開。

好比分佈式緩存的使用,緩存置換策略及算法,緩存過時機制等。

系列目錄:

那些年咱們一塊兒追過的緩存寫法(一)

那些年咱們一塊兒追過的緩存寫法(二) 

那些年咱們一塊兒追過的緩存寫法(三) 

相關文章
相關標籤/搜索