注:從網(wǎng)上找到的一篇很不錯(cuò)的關(guān)于緩存的文章,最原始的出處已經(jīng)找不到了。只截取了前半部分關(guān)于緩存的介紹
介紹緩存的基本概念和常用的緩存技術(shù),給出了各種技術(shù)的實(shí)現(xiàn)機(jī)制的簡(jiǎn)單介紹和適用范圍說明,以及設(shè)計(jì)緩存方案應(yīng)該考慮的問題
1 概念
1.1 緩存能解決的問題
· 性能——將相應(yīng)數(shù)據(jù)存儲(chǔ)起來以避免數(shù)據(jù)的重復(fù)創(chuàng)建、處理和傳輸,可有效提高性能。比如將不改變的數(shù)據(jù)緩存起來,例如國家列表等,這樣能明顯提高web程序的反應(yīng)速度;
· 穩(wěn)定性——同一個(gè)應(yīng)用中,對(duì)同一數(shù)據(jù)、邏輯功能和用戶界面的多次請(qǐng)求時(shí)經(jīng)常發(fā)生的。當(dāng)用戶基數(shù)很大時(shí),如果每次請(qǐng)求都進(jìn)行處理,消耗的資源是很大的浪費(fèi),也同時(shí)造成系統(tǒng)的不穩(wěn)定。例如,web應(yīng)用中,對(duì)一些靜態(tài)頁面的呈現(xiàn)內(nèi)容進(jìn)行緩存能有效的節(jié)省資源,提高穩(wěn)定性。而緩存數(shù)據(jù)也能降低對(duì)數(shù)據(jù)庫的訪問次數(shù),降低數(shù)據(jù)庫的負(fù)擔(dān)和提高數(shù)據(jù)庫的服務(wù)能力;
· 可用性——有時(shí),提供數(shù)據(jù)信息的服務(wù)可能會(huì)意外停止,如果使用了緩存技術(shù),可以在一定時(shí)間內(nèi)仍正常提供對(duì)最終用戶的支持,提高了系統(tǒng)的可用性。
1.2 理解狀態(tài)
在深入介紹緩存技術(shù)之前,需要對(duì)狀態(tài)有一個(gè)認(rèn)識(shí),因?yàn)榫彺婵梢哉f是狀態(tài)管理的框架。理解狀態(tài)的含義和它的一些特性—— 比如生存期和生存范圍——對(duì)決定是否緩存和選擇合適的緩存技術(shù)有很大幫助。
狀態(tài)是指一些數(shù)據(jù),在應(yīng)用系統(tǒng)某個(gè)時(shí)間點(diǎn)上,數(shù)據(jù)的狀態(tài)和條件。這些數(shù)據(jù)可能是永久性的存儲(chǔ)在數(shù)據(jù)庫中,可能是只在內(nèi)存里停留一會(huì),也可能是按照某個(gè)邏輯存活(比如多長時(shí)間后釋放),它的應(yīng)用范圍可能是所有用戶可訪問,可能是單個(gè)用戶有權(quán)限;
1.2.1 狀態(tài)的生存期
生存期是指數(shù)據(jù)保持有效性的時(shí)間區(qū)間,也就是從創(chuàng)建到移除的時(shí)間間隔。通常的生存期有以下幾種:
·永久狀態(tài)Permanent State——應(yīng)用程序使用的永久數(shù)據(jù);(注:如數(shù)據(jù)庫數(shù)據(jù))
·進(jìn)程狀態(tài)Process State——只在進(jìn)程周期內(nèi)有效;(注:如應(yīng)用程序運(yùn)行期間)
·會(huì)話狀態(tài)Session State——和特定的用戶會(huì)話有關(guān);(注:如瀏覽器運(yùn)行期間)
·消息狀態(tài)Message State——處理某個(gè)消息的時(shí)間內(nèi)有效;(注:如頁面瀏覽期間)
1.2.2 狀態(tài)的范圍
狀態(tài)的范圍指對(duì)該狀態(tài)有訪問權(quán)限的物理或邏輯范圍。
·物理范圍指可以被訪問到的狀態(tài)數(shù)據(jù)存放的物理位置,通常包括:
1、組織Organization——在一個(gè)組織內(nèi)的所有應(yīng)用程序可以訪問狀態(tài)數(shù)據(jù);
2、場(chǎng)Farm——在應(yīng)用場(chǎng)范圍內(nèi)的任何機(jī)器上都可以訪問;
3、機(jī)器Machine——單個(gè)機(jī)器范圍內(nèi)可以訪問;
4、進(jìn)程Process——進(jìn)程內(nèi)的訪問許可;
5、應(yīng)用域AppDomain——應(yīng)用程序域內(nèi)的訪問許可。
·邏輯范圍指可訪問狀態(tài)數(shù)據(jù)的邏輯范圍,常見的有:
1、應(yīng)用程序Application;
2、業(yè)務(wù)流程Business Process;
3、角色Role;
4、用戶User;
1.2.3 狀態(tài)數(shù)據(jù)的陳舊
緩存的狀態(tài)數(shù)據(jù)只是主數(shù)據(jù)(Master State Data)的快照,由于數(shù)據(jù)源可能被修改,所以狀態(tài)數(shù)據(jù)就有會(huì)陳舊的特性。合理利用此特性和將數(shù)據(jù)陳舊的負(fù)面影響最小化是緩存狀態(tài)數(shù)據(jù)的一個(gè)重要任務(wù)。你可以以一下方式定義數(shù)據(jù)的陳舊依據(jù):
·主數(shù)據(jù)更改的可能性——隨著時(shí)間的推進(jìn),主數(shù)據(jù)更改的可能是否大大增加?安照這一點(diǎn)來決定緩存狀態(tài)數(shù)據(jù)的陳舊;
·更改的相關(guān)性——主數(shù)據(jù)更新時(shí),緩存的狀態(tài)數(shù)據(jù)不相應(yīng)更新是不是造成影響系統(tǒng)的使用?比如,更改系統(tǒng)的外觀風(fēng)格并不會(huì)對(duì)業(yè)務(wù)造成很大影響。
1.2.4 狀態(tài)數(shù)據(jù)陳舊的容忍度
緩存狀態(tài)數(shù)據(jù)的陳舊對(duì)業(yè)務(wù)流程的影響稱為容忍度,應(yīng)用系統(tǒng)的可以為不能容忍(No Tolerance)和一定程度的容忍(some Tolerance),前者必須和主數(shù)據(jù)同步更新,后者允許一定時(shí)間或一定范圍的陳舊,判斷標(biāo)準(zhǔn)就是對(duì)業(yè)務(wù)流程的影響度。
1.2.5 理解狀態(tài)數(shù)據(jù)的轉(zhuǎn)換過程
狀態(tài)的另一個(gè)屬性是在不同階段的表現(xiàn)形式。在數(shù)據(jù)庫中存儲(chǔ)的是原始格式的數(shù)據(jù),業(yè)務(wù)流程中的是處理過的數(shù)據(jù),給最終用戶呈現(xiàn)的則是另外的形式。如下表所示:
表現(xiàn)形式 描述 舉例
=======================================================================
原始數(shù)據(jù) 數(shù)據(jù)的原始形式 如數(shù)據(jù)庫中的數(shù)據(jù)
處理過的數(shù)據(jù) 業(yè)務(wù)流程中對(duì)原始數(shù)據(jù)加工后的數(shù)據(jù) 業(yè)務(wù)過程中的數(shù)據(jù)形式
呈現(xiàn)形式 可呈現(xiàn)給最終用戶的形式 HTML或可理解的文字說明
========================================================================
當(dāng)決定緩存數(shù)據(jù)時(shí),應(yīng)該考慮緩存哪個(gè)階段(哪種形式)的狀態(tài)數(shù)據(jù)。以下方針有助于你做決定:
·當(dāng)業(yè)務(wù)邏輯可以容忍緩存數(shù)據(jù)的陳舊時(shí)就緩存原始數(shù)據(jù);原始數(shù)據(jù)可以緩存在數(shù)據(jù)庫訪問組件和服務(wù)代理中;
·緩存處理過的數(shù)據(jù)以減少處理時(shí)間和資源;處理過的數(shù)據(jù)可以緩存在業(yè)務(wù)邏輯組件和服務(wù)接口中。
·當(dāng)需要呈現(xiàn)的數(shù)據(jù)量很大并且控件的呈現(xiàn)時(shí)間很長時(shí),緩存呈現(xiàn)數(shù)據(jù)(比如包含大數(shù)據(jù)量的Treeview控件)。這種數(shù)據(jù)應(yīng)該被緩存在UI控件中。
1.3 為什么要緩存數(shù)據(jù)
在應(yīng)用程序中緩存數(shù)據(jù)有以下好處:
·減少交互的通訊量——緩存數(shù)據(jù)能有效減少在進(jìn)程和機(jī)器間的傳輸量;
·降低系統(tǒng)中的處理量——減少處理次數(shù);
·降低需要做的磁盤訪問次數(shù)——比如緩存在內(nèi)存中的數(shù)據(jù)。
1.4 數(shù)據(jù)應(yīng)該被緩存在哪里
緩存數(shù)據(jù)只是一份主數(shù)據(jù)的拷貝,它可能在內(nèi)存中或以不同的表現(xiàn)形式保存在硬盤上,也就是說,離數(shù)據(jù)的使用者越近越好。
所以,除了考慮要緩存哪些數(shù)據(jù)以外,數(shù)據(jù)緩存在哪里也是一個(gè)主要的考量點(diǎn)。這個(gè)問題分為以下兩個(gè)范圍:
1、存儲(chǔ)類型Storage Type——數(shù)據(jù)可用的物理存儲(chǔ)位置;
2、層間的架構(gòu)元素(Layered architecture elements)——數(shù)據(jù)可用的邏輯存儲(chǔ)位置。
1.4.1 存儲(chǔ)類型
緩存有很多實(shí)現(xiàn)方法,所有這些可以被分為兩類,基于內(nèi)存的緩存和基于磁盤的緩存:
1、內(nèi)存駐留緩存——包含在內(nèi)存中臨時(shí)存儲(chǔ)數(shù)據(jù)的所有實(shí)現(xiàn)方法,通常在以下情況下使用:
a) 應(yīng)用程序頻繁使用同樣的數(shù)據(jù);
b) 應(yīng)用程序需要經(jīng)常獲取數(shù)據(jù);
通過將數(shù)據(jù)保留在內(nèi)存中,你可以有效降低昂貴的磁盤訪問操作,也可以通過將數(shù)據(jù)保留在使用者進(jìn)程中來最大程度的減少跨進(jìn)程的數(shù)據(jù)傳輸。
2、磁盤駐留緩存——這種技術(shù)包含所有使用磁盤作為存儲(chǔ)介質(zhì)的緩存技術(shù),如文件和數(shù)據(jù)庫。在以下情況下基于磁盤的緩存是很有效的:
a) 處理大數(shù)據(jù)量時(shí);
b) 應(yīng)用服務(wù)提供的數(shù)據(jù)可能并不是總能使用(比如離線的情況);
c) 緩存的數(shù)據(jù)必須能在進(jìn)程回收和機(jī)器重啟的情況下保持有效;
通過緩存處理過的數(shù)據(jù),你可以有效降低數(shù)據(jù)處理的負(fù)擔(dān),同時(shí)可減少數(shù)據(jù)交互的代價(jià)。
1.4.2 架構(gòu)間元素
應(yīng)用程序中的每個(gè)邏輯層的組件都會(huì)處理數(shù)據(jù),下圖標(biāo)識(shí)了一些通用組件: 當(dāng)使用這些組件進(jìn)行工作時(shí),你需要考慮哪些數(shù)據(jù)可以被緩存起來,還有以哪種方式進(jìn)行緩存會(huì)對(duì)程序的整體性能和可用性有幫助,以上的這些元素都可以緩存相應(yīng)的數(shù)據(jù)。當(dāng)然,要考慮的遠(yuǎn)不止這些。
1.5 實(shí)施緩存時(shí)的考慮
當(dāng)設(shè)計(jì)一個(gè)緩存方案時(shí),不但要考慮緩存哪些數(shù)據(jù)、數(shù)據(jù)緩存到哪里,還有其它的因素需要考慮。
1.5.1 格式和訪問模式
當(dāng)決定是否緩存一個(gè)對(duì)象時(shí),關(guān)于數(shù)據(jù)的格式和訪問機(jī)制,你需要考慮三個(gè)主要問題:
1、線程安全——當(dāng)緩存的內(nèi)容可以被多個(gè)線程訪問時(shí),使用某種鎖定機(jī)制來保證數(shù)據(jù)不會(huì)被兩個(gè)線程同時(shí)操作;
2、序列化——將一個(gè)對(duì)象緩存時(shí),需要將它序列化以便保存,所以包緩存的對(duì)象必須支持序列化;
3、規(guī)格化緩存數(shù)據(jù)——緩存數(shù)據(jù)時(shí),相對(duì)于要使用的數(shù)據(jù)格式而言,要保證數(shù)據(jù)的格式是優(yōu)化過的。
1.5.2 內(nèi)容加載
在使用緩存數(shù)據(jù)前,必須將數(shù)據(jù)加載到緩存中,有兩種機(jī)制來加載數(shù)據(jù):
·提前加載Proactive Load——使用這種方式時(shí),你提前將所有的狀態(tài)數(shù)據(jù)加載到緩存中,可能在應(yīng)用程序或線程啟動(dòng)時(shí)進(jìn)行,然后在應(yīng)用程序或線程的生存期內(nèi)一直緩存;
·動(dòng)態(tài)加載Reactive Load——或稱反應(yīng)式加載,當(dāng)使用這種方法時(shí),在應(yīng)用程序請(qǐng)求數(shù)據(jù)時(shí)取到數(shù)據(jù),并且將它緩存起來以備后續(xù)使用。
1.5.3 過期策略
另外一個(gè)關(guān)鍵因素是如何保持緩存數(shù)據(jù)和主數(shù)據(jù)(文件或數(shù)據(jù)庫或其他的應(yīng)用程序資源)的一致性,你可以定義過期策略來決定緩存中的內(nèi)容,如已經(jīng)緩存的時(shí)間或者收到其他資源的通知。
1.5.4 安全性
當(dāng)緩存數(shù)據(jù)時(shí),需要非常清楚緩存中數(shù)據(jù)的潛在安全威脅。緩存中的數(shù)據(jù)可能會(huì)被別的進(jìn)程訪問或修改,而此進(jìn)程對(duì)主數(shù)據(jù)是沒有權(quán)限的。
原因是當(dāng)數(shù)據(jù)存儲(chǔ)在原始位置時(shí),有相應(yīng)的安全機(jī)制來保護(hù)它,當(dāng)數(shù)據(jù)被帶出傳統(tǒng)的安全邊界時(shí),需要有同等的安全機(jī)制。
1.5.5 管理
當(dāng)你緩存數(shù)據(jù)時(shí),應(yīng)用系統(tǒng)需要的維護(hù)工作加大了。在發(fā)布應(yīng)用程序時(shí),需要配置相應(yīng)的屬性,比如緩存的大小限制和清除策略。同時(shí)要使用某種機(jī)制來監(jiān)控緩存的效率(比如事件日志和性能計(jì)數(shù)器)
1.6 小結(jié)
第一節(jié)內(nèi)容簡(jiǎn)單介紹了緩存技術(shù)中的概念、緩存數(shù)據(jù)的原因和方案、優(yōu)勢(shì)、實(shí)施緩存方案時(shí)的考慮等基本內(nèi)容。現(xiàn)在你對(duì)緩存中涉及的內(nèi)容有了一個(gè)大致了解,下面著重介紹可用的緩存技術(shù)。
-------------------------------------------------------------
生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。
posted on 2010-10-19 11:09
Paul Lin 閱讀(515)
評(píng)論(0) 編輯 收藏 所屬分類:
架構(gòu)與性能