1、什麼是ASP緩存/爲何要緩存html
其實當你的web站點採用asp技術創建的初期,可能會感受到的是asp動態網頁技術帶來的便利性,以及隨意修改性、自如的http控制。但隨着訪問量的增長,你必定會發現本身的站點訪問速度會愈來愈慢,IIS從新啓動得愈來愈頻繁。那麼,你必定想怎麼優化你的asp程序,諸如更換性能更優異的數據庫、創建索引、編寫存儲過程等等。這些措施有些不須要增長成本壓力,有些則成本壓力很大(譬如叢access到SQL),並且效果還不必定。web
面對web訪問壓力,我認爲最經濟的辦法是利用緩存優化技術來實現緩解web的服務壓力。數據庫
Web訪問量增長一般意味着如下資源需求的快速增加:編程
一、網卡流量增長,須要消耗更多的CPU處理網絡流量和網絡I/O線程。瀏覽器
二、須要更頻繁的打開/關閉數據庫連結(若是使用數據庫技術—一般asp都會採用數據庫做爲數據存儲),嚴重消耗資源的事物數量、以及事務相互競爭資源引發的死鎖、會增長網絡I/O或者CPU消耗。緩存
三、若是採用session的話,IIS爲了維持狀態,會消耗更多內存,而內存消耗可能會引起物理內存不夠,引發物理內存同輔存間的頻繁交換,從而引發代碼執行的停頓,web響應阻滯。服務器
四、因爲訪問的不到及時響應,會引發網頁訪問故障,致使用戶刷新,從而加重CPU、內存等資源需求。網絡
實際上,考慮一般的web應用程序,不少時候的動態代碼執行是沒必要要的。 session
2、asp緩存的分類app
擅自總結,asp的緩存能夠分爲兩類:
一、文件緩存
所謂文件緩存,就是根據邏輯判斷,一段時間內某個asp的特定執行將不會有很大的變更,於是將內容以靜態html的形式存放,而後以web的重定向技術讓客戶端訪問靜態文件,以達到減小CPU、數據庫資源等的需求。這樣的應用不少,譬如不少論壇就是在回覆貼子的時候將整個貼子從新生成一個靜態文件,而後進行重定向的,例如 donews.com的論壇。該成靜態還有一個反作用(好處)--能夠很容易被google等搜索引擎收錄。一些所謂新聞發佈系統的都採用了此技術。
二、文件片段緩存
所謂文件緩存,也是基於邏輯判斷,某部分數據(一般是須要消耗資源的大容量數據庫查詢取得)在必定時間內不會改變,因此咱們能夠將這些數據利用文件的形式進行存儲,當須要時候,能夠經過讀取文件來獲取數據,避免增長數據庫的負擔。例如,咱們一般將一些數據以xml格式存儲,而後利用xslt技術實現顯示(xml處理一般須要大量CPU資源,因此一般是IE直接讀取xml到客戶端在客戶的CPU上進行處理)。CSDN的論壇就是這樣處理的。
三、主存緩存
除此以外,還能夠考慮在內存中處理緩存,將須要及時響應的內容存儲在內存中,一旦訪問需求,當即從快速的貯存中輸送出去。若是極大量的訪問需求集中在幾個少許的頁面或者主存足夠多,我想採用主存緩存必定能夠大幅度提升web訪問性能。
3、如何實現/使用緩存
實現緩存須要考慮如下問題:
一、哪些頁面會在短期內不會改變?
分析本身的站點,這樣的頁面不少。譬如一個站點一般都有新聞資訊類的欄目,這些欄目一般都是站點維護人員在一天的某個時間發佈資料,以後不多改動頁面。那麼這些頁面就適合於採用靜態文件緩存。實際上,所謂新聞發佈系統就是這麼作的,那麼那也能夠參考這些系統的思想改造本身的原有動態asp頁面。
二、那些頁面針對所有訪問者都採用同一個邏輯生成(也就是不區分訪問者)。
除了新聞資訊之類的欄目全部訪問者都看一個界面外,論壇等消耗資源的應用通常也能夠設計成統一邏輯生成(同一個貼子,張三李四看的都同樣),針對這類應用頁面咱們也能夠採用靜態緩存來實現。也能夠考慮將數據片段化,利用腳本技術在服務器處理能力以外也就是客戶端瀏覽器進行處理。
三、採用緩存的代價和收穫。
主要就是「空間換(響應)時間」。利用緩存技術將以後頻繁須要的內容進行預處理,使之提升web服務器響應能力,更重要贏得訪問者的歡心。
代價就是web空間需求增長,同時又可能影響到訪問效果。
但我認爲適當的緩存,是利大於弊的。
四、那些地方不適宜採用緩存
動態查詢頁面,每一個人的查詢內容不同,因此顯示結果不大同樣,因此不大可能將查詢結果生成緩存,因此採用緩存較爲複雜且緩存利用率底下,形成管理成本上什(假設你緩存了1000個查詢關鍵字,那麼管理這些關鍵字同緩存的對應也是麻煩事)。
4、實例分析
假設一個建議論壇的原有佈局以下:
根目錄下:
default.asp首頁,通常是精華、推薦之類
listBorad.asp 該文件列出所有分欄目的名稱和介紹,若是攜帶參數MainBID就表示要列出板塊下的欄目
listThread.asp該文件若是不攜帶任何參數表示列出所有的貼子,攜帶MainBID表示列出某塊的所有貼子。若是攜帶subBID表示列出具體欄目的貼子。若是攜帶page參數表示分頁列出主題。
ViewThread.asp 列出某個貼子內容。咱們假設貼子顯示爲一個發言,任意跟貼所有列在後面。ID參數爲要顯示的貼子。
Reply.asp 迴應某個貼子,攜帶參數Id迴應某個貼子
其它的暫不討論。
以上,咱們能夠看到,若是所有是採用原始的ASP/PHP來作,那幾乎每個asp文件的執行都須要數據庫操做,頻繁的查詢,多表查詢。要知道查詢數據庫最終會帶來性能的降低,響應速度降低,帶給訪問者緩慢的瀏覽影響,不利於web的質量。更重要的是對於甲乙兩我的來將,他們訪問ViewThread.asp之類的若是ID一致,那麼不少時候他們會看到一樣的內容(他們的瀏覽器收到的HTML代碼幾乎同樣),可是爲了這「一樣的內容」,服務器須要打開數據庫連結、查詢,讀取紀錄,顯示,關閉紀錄、數據庫連結。。。。如下列的消耗服務器資源的操做,若是是更多的人來訪問,最終的結果是這些人加重消耗服務器資源。實際上,這些爲了「一樣的內容」所作的重複勞動是能夠利用緩存技術進行優化避免的。譬如:
在reply.asp提交內容後,咱們當即調用生成靜態的功能,將整個貼子內容存儲爲viewThread_xxxx.htm之類的靜態html文件,再一般狀況下訪問viewThread.asp?ID=xxxx的時候,系統自動redirect到對應的靜態文件viewThreadxxxx.htm去。這樣,當一個貼子沒有最新發布時候,他始終是靜態內容提供給瀏覽者;一旦有了新的提交,將會更新到靜態文件中去,這樣,將會節省不少次數據庫操做,大大提升響應速度。
listBorad.asp也能夠實施靜態化。咱們能夠分析其可能攜帶的參數,將緩存文件名設定爲listBoard_xx.htm,在增長新的欄目時候進行更新listBoard_xxx.htm。listThread.asp也相似,只不過因爲其參數更多,因此緩存文件也會不少。擊若要緩存listThread.asp? subBID=xxx&page=2,那麼對應的靜態文件是listThread_xxx_p2.htm。default.asp也同樣。
那麼如何判斷何時更新?在什麼時機更新?
討論listThread.asp? subBID=xxx&page=2,咱們在執行listThread.asp俄時候提取subID和page,而後探測listThread_xxx_p2.htm是否存在,若是不存在就調用靜態生成功能進行生成該文件,最終重定向到此靜態文件。注意,此處的不存在就意味着出現了新的內容須要咱們進行更新。
那如何形成文件不存在呢?刪除。咱們在發表一個新的貼子、刪除貼子、移動貼子的時候咱們能夠將相似listThread_xxx_p2.htm之類的靜態文件所有刪除。這樣就通知了什麼時候要進行緩存。
如今還剩下一個問題,如何生成靜態文件?
咱們注意到,以前咱們提到的「一樣的內容」。咱們能夠將改造前的default.asp、listThread.asp等拷貝一個副本,取名爲default_d.asp、listThread_2.asp,且在同一個目錄中(理論上listThtrad.asp?subID=123同LISTtHREAD_D.ASP?SUBID=123的訪問結果會是一樣的內容),這樣咱們在須要生成靜態文件的邏輯中,經過WEB訪問請求的方式調用改造前的副本,獲得html代碼,並存儲爲靜態文件。這個web請求實際上至關於在任何真實瀏覽者訪問靜態內容以前,由服務器自身現察看將會輸出的html,而後返回這些代碼,利用文件操做功能存儲爲靜態文件。這樣,緩存文件就在真正瀏覽者以前被建立。
這樣的方案几乎不觸動原來的佈局,幾乎不會形成由於改造出現404之類的錯誤。其次,靜態文件也會幫助你的站點容易被被google之類的搜索引擎收錄。何樂而不爲?
最後,提醒,經過web訪問,asp編程環境下,不少人採用xmlHTTP組件訪問,這會形成不少問題。xmlhttp自身會cache請求的資源,致使咱們經過此組件請求獲得的內容不是最新的,形成邏輯上的混亂。因此,應當選擇xml Server http對象或者winhttp組件來實現web請求資源。
80摘後語:實現緩存技術主要有幾種關鍵的東西,
服務器端application,適用於多個頁面間存在較多不太常常更新的元素;
生成HTML靜態文件,一般會採用模版技術,經過FSO或ADOStream生成靜態文件,一般都適用於不少人看到的都是一樣的頁面內容的狀況,如文章、論壇帖子等;
其餘
其實最重要的仍是根據本身系統的需求來決定採用何種技術,儘可能少地減小查詢數據庫的次數,減輕數據庫壓力,固然,通常會以犧牲空間作代價。
另外,正在考慮是否可以採用客戶端的緩存來提升效率?