posts - 262,  comments - 221,  trackbacks - 0
          注:從網(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)與性能
          <2010年10月>
          262728293012
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          常用鏈接

          留言簿(21)

          隨筆分類

          隨筆檔案

          BlogJava熱點(diǎn)博客

          好友博客

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 桦甸市| 佛冈县| 乌鲁木齐市| 深水埗区| 临漳县| 满城县| 汝南县| 温泉县| 新乡县| 盐亭县| 鸡东县| 铅山县| 龙胜| 洛浦县| 迁西县| 论坛| 闽侯县| 广宁县| 阳山县| 昆山市| 清水河县| 阿合奇县| 夏河县| 建始县| 嘉荫县| 肃南| 德兴市| 顺义区| 蒙山县| 清苑县| 紫金县| 墨江| 嘉兴市| 弥渡县| 鹤岗市| 沁阳市| 自治县| 瓮安县| 灵武市| 通渭县| 措美县|