介紹緩存的基本概念和常用的緩存技術(轉)


摘要: 介紹緩存的基本概念和常用的緩存技術,給出了各種技術的實現機制的簡單介紹和適用范圍說明,以及設計緩存方案應該考慮的問題

1  概念

  緩存是介於應用程序和物理數據源之間,其作用是為了降低應用程序對物理數據源訪問的頻次,從而提高了應用的運行性能。緩存內的數據是對物理數據源中的數據的復制,應用程序在運行時從緩存讀寫數據,在特定的時刻或事件會同步緩存和物理數據源的數據。

1.1   緩存能解決的問題

    · 性能——將相應數據存儲起來以避免數據的重復創建、處理和傳輸,可有效提高性能。比如將不改變的數據緩存起來,例如國家列表等,這樣能明顯提高web程序的反應速度;

    · 穩定性——同一個應用中,對同一數據、邏輯功能和用戶界面的多次請求時經常發生的。當用戶基數很大時,如果每次請求都進行處理,消耗的資源是很大的浪費,也同時造成系統的不穩定。例如,web應用中,對一些靜態頁面的呈現內容進行緩存能有效的節省資源,提高穩定性。而緩存數據也能降低對數據庫的訪問次數,降低數據庫的負擔和提高數據庫的服務能力;

    · 可用性——有時,提供數據信息的服務可能會意外停止,如果使用了緩存技術,可以在一定時間內仍正常提供對最終用戶的支持,提高了系統的可用性。

1.2   理解狀態

  在深入介紹緩存技術之前,需要對狀態有一個認識,因為緩存可以說是狀態管理的框架。理解狀態的含義和它的一些特性——比如生存期和生存范圍——對決定是否緩存和選擇合適的緩存技術有很大幫助。狀態是指一些數據,在應用系統某個時間點上,數據的狀態和條件。這些數據可能是永久性的存儲在數據庫中,可能是只在內存里停留一會,也可能是按照某個邏輯存活(比如多長時間后釋放),它的應用范圍可能是所有用戶可訪問,可能是單個用戶有權限;

1.2.1  狀態的生存期

  生存期是指數據保持有效性的時間區間,也就是從創建到移除的時間間隔。通常的生存期有以下幾種:

    ·永久狀態Permanent State——應用程序使用的永久數據;

    ·進程狀態Process State——只在進程周期內有效;

    ·會話狀態Session State——和特定的用戶會話有關;

    ·消息狀態Message State——處理某個消息的時間內有效;

1.2.2  狀態的范圍

  狀態的范圍指對該狀態有訪問權限的物理或邏輯范圍。

   ·物理范圍指可以被訪問到的狀態數據存放的物理位置,通常包括:

    1、  組織Organization——在一個組織內的所有應用程序可以訪問狀態數據;

    2、  場Farm——在應用場范圍內的任何機器上都可以訪問;

    3、  機器Machine——單個機器范圍內可以訪問;

    4、  進程Process——進程內的訪問許可;

    5、  應用域AppDomain——應用程序域內的訪問許可。

   ·邏輯范圍指可訪問狀態數據的邏輯范圍,常見的有:

    1、  應用程序Application;

    2、  業務流程Business Process;

    3、  角色Role;

    4、  用戶User;

1.2.3  狀態數據的陳舊

  緩存的狀態數據只是主數據(Master State Data)的快照,由於數據源可能被修改,所以狀態數據就有會陳舊的特性。合理利用此特性和將數據陳舊的負面影響最小化是緩存狀態數據的一個重要任務。你可以以一下方式定義數據的陳舊依據:

   ·主數據更改的可能性——隨着時間的推進,主數據更改的可能是否大大增加?安照這一點來決定緩存狀態數據的陳舊;

   ·更改的相關性——主數據更新時,緩存的狀態數據不相應更新是不是造成影響系統的使用?比如,更改系統的外觀風格並不會對業務造成很大影響。

1.2.4  狀態數據陳舊的容忍度

  緩存狀態數據的陳舊對業務流程的影響稱為容忍度,應用系統的可以為不能容忍(No Tolerance)和一定程度的容忍(some Tolerance),前者必須和主數據同步更新,后者允許一定時間或一定范圍的陳舊,判斷標准就是對業務流程的影響度。

1.2.5  理解狀態數據的轉換過程

  狀態的另一個屬性是在不同階段的表現形式。在數據庫中存儲的是原始格式的數據,業務流程中的是處理過的數據,給最終用戶呈現的則是另外的形式。如下表所示:

表現形式

描述

舉例

原始數據

數據的原始形式

如數據庫中的數據

處理過的數據

業務流程中對原始數據加工后的數據

業務過程中的數據形式

呈現形式

可呈現給最終用戶的形式

HTML或可理解的文字說明

  當決定緩存數據時,應該考慮緩存哪個階段(哪種形式)的狀態數據。以下方針有助於你做決定:

    · 當業務邏輯可以容忍緩存數據的陳舊時就緩存原始數據;原始數據可以緩存在數據庫訪問組件和服務代理中;

    ·緩存處理過的數據以減少處理時間和資源;處理過的數據可以緩存在業務邏輯組件和服務接口中。

    ·當需要呈現的數據量很大並且控件的呈現時間很長時,緩存呈現數據(比如包含大數據量的Treeview控件)。這種數據應該被緩存在UI控件中。

1.3   為什么要緩存數據

  在應用程序中緩存數據有以下好處:

    ·減少交互的通訊量——緩存數據能有效減少在進程和機器間的傳輸量;

    ·降低系統中的處理量——減少處理次數;

    ·降低需要做的磁盤訪問次數——比如緩存在內存中的數據。

1.4   數據應該被緩存在哪里

  緩存數據只是一份主數據的拷貝,它可能在內存中或以不同的表現形式保存在硬盤上,也就是說,離說句的使用者越近越好。所以,除了考慮要緩存哪些數據以外,數據緩存在哪里也是一個主要的考量點。這個問題分為以下兩個范圍:

  1、  存儲類型Storage Type——數據可用的物理存儲位置;

  2、  層間的架構元素(Layered architecture elements)——數據可用的邏輯存儲位置。

1.4.1  存儲類型

  緩存有很多實現方法,所有這些可以被分為兩類,基於內存的緩存和基於磁盤的緩存:

  1、  內存駐留緩存——包含在內存中臨時存儲數據的所有實現方法,通常在以下情況下使用:

    a)       應用程序頻繁使用同樣的數據;

    b)       應用程序需要經常獲取數據;

  通過將數據保留在內存中,你可以有效降低昂貴的磁盤訪問操作,也可以通過將數據保留在使用者進程中來最大程度的減少跨進程的數據傳輸。

  2、  磁盤駐留緩存——這種技術包含所有使用磁盤作為存儲介質的緩存技術,如文件和數據庫。在以下情況下基於磁盤的緩存是很有效的:

    a)       處理大數據量時;

    b)       應用服務提供的數據可能並不是總能使用(比如離線的情況);

    c)       緩存的數據必須能在進程回收和機器重啟的情況下保持有效;

  通過緩存處理過的數據,你可以有效降低數據處理的負擔,同時可減少數據交互的代價。

  緩存的介質一般是內存,所以讀寫速度很快。但如果緩存中存放的數據量非常大時,也會用硬盤作為緩存介質。

1.4.2  架構間元素

  應用程序中的每個邏輯層的組件都會處理數據,下圖標識了一些通用組件:

 

 

  當使用這些組件進行工作時,你需要考慮哪些數據可以被緩存起來,還有以哪種方式進行緩存會對程序的整體性能和可用性有幫助,以上的這些元素都可以緩存相應的數據。當然,要考慮的遠不止這些。

1.5   實施緩存時的考慮

  當設計一個緩存方案時,不但要考慮緩存哪些數據、數據緩存到哪里,還有其它的因素需要考慮。

1.5.1  格式和訪問模式

  當決定是否緩存一個對象時,關於數據的格式和訪問機制,你需要考慮三個主要問題:

    1、  線程安全——當緩存的內容可以被多個線程訪問時,使用某種鎖定機制來保證數據不會被兩個線程同時操作;

    2、  序列化——將一個對象緩存時,需要將它序列化以便保存,所以包緩存的對象必須支持序列化;

    3、  規格化緩存數據——緩存數據時,相對於要使用的數據格式而言,要保證數據的格式是優化過的。

1.5.2  內容加載

  在使用緩存數據前,必須將數據加載到緩存中,有兩種機制來加載數據:

   ·提前加載Proactive Load——使用這種方式時,你提前將所有的狀態數據加載到緩存中,可能在應用程序或線程啟動時進行,然后在應用程序或線程的生存期內一直緩存;

     ·動態加載Reactive Load——或稱反應式加載,當使用這種方法時,在應用程序請求數據時取到數據,並且將它緩存起來以備后續使用。

1.5.3  過期策略

  另外一個關鍵因素是如何保持緩存數據和主數據(文件或數據庫或其他的應用程序資源)的一致性,你可以定義過期策略來決定緩存中的內容,如已經緩存的時間或者收到其他資源的通知。

1.5.4  安全性

  當緩存數據時,需要非常清楚緩存中數據的潛在安全威脅。緩存中的數據可能會被別的進程訪問或修改,而此進程對主數據是沒有權限的。原因是當數據存儲在原始位置時,有相應的安全機制來保護它,當數據被帶出傳統的安全邊界時,需要有同等的安全機制。

1.5.5  管理

  當你緩存數據時,應用系統需要的維護工作加大了。在發布應用程序時,需要配置相應的屬性,比如緩存的大小限制和清除策略。同時要使用某種機制來監控緩存的效率(比如事件日志和性能計數器)

1.6   小結

  第一節內容簡單介紹了緩存技術中的概念、緩存數據的原因和方案、優勢、實施緩存方案時的考慮等基本內容。現在你對緩存中涉及的內容有了一個大致了解,下面着重介紹可用的緩存技術。

緩存技術

本節將介紹以下技術:

使用Asp.Net緩存;

使用Remoting Singleton緩存;

使用內存映射文件;

使用SQL Server緩存;

使用靜態變量緩存;

使用Asp.net 會話狀態(Session State);

使用Asp.net客戶端緩存和狀態;

使用Internet Explorer緩存。

 

舉例:靜態的網站的內容都是些簡單的靜態網頁直接存儲在服務器上,可以非常容易地達到非常驚人的訪問量。但是動態網站因為是動態的,也就是說每次用戶訪問一個頁面,服務器要執行數據庫查詢,啟動模板,執行業務邏輯到最終生成一個你所看到的網頁,這一切都是動態即時生成的。從處理器資源的角度來看,這是比較昂貴的。

 

附:

  首先,存儲器在目前的大部分計算機中都是層級結構的。不同級別的存儲器我們給予不同的命名,方便區分。一般硬盤、軟盤、U盤等我們稱之為外存儲器,與CPU相近讀取速度快些的直接插在主板上的我們稱之為內存儲器,即內存,還有更接近些的讀取速度更快的一般跟CPU封裝在一個芯片上的存儲器,我們稱之為高速緩存。

  讀取速度:寄存器>高速緩存>內存>磁盤

  數據就在這些存儲器上傳遞、修改、存儲。到底是怎么“傳遞讀取”和“修改寫錄”的,那就關系到具體的存儲器和布線結構了。

數據是如何從內存中取出來的?
  每個0和1在硬件中都表示為低電平和高電平兩個狀態,這兩種狀態可以用一種特殊的叫鎖存器的神奇的東西儲存着。每一個鎖存器儲存一個位,那么很多很多的鎖存器串在一起就可以儲存很多個位了。
  為了存取方便,有的計算機(就是我們正在使用的計算機)以8個位為一組存取,8個位就是一個字節。他們就像一座座房子在內存里面負責儲存數據,為了方便找到這些房子,就要給他們編一個地址,一個地址對應一個字節。
  當CPU想要訪問一個內存中某一個(或一些)字節的數據時,CPU先向內存控制器發要訪問的地址,內存控制器根據地址找到相應的地址單元,然后把數據傳回CPU。

  鏈接:http://www.zhihu.com/question/22457469


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM