1. 程式人生 > >網站優化之頁面級快取方案

網站優化之頁面級快取方案

用快取來優化網站效能的方法,估計是無人不知的。 ASP.NET提供了HttpRuntime.Cache物件來快取資料,也提供了OutputCache指令來快取整個頁面輸出。 雖然OutputCache指令使用起來更方便,也有非常好的效果, 不過,它需要我們在那些頁面中新增這樣一個指令。

對於設定過OutputCache的頁面來說,瀏覽器在收到這類頁面的響應後,會將頁面響應內容快取起來。 只要在指定的快取時間之內,且使用者沒有強制重新整理的操作,那麼就根本不會再次請求服務端, 而對於來自其它的瀏覽器發起的請求,如果快取頁已生成,那麼就可以直接從快取中響應請求,加快響應速度。 因此,OutputCache指令對於效能優化來說,是很有意義的(除非所有頁面頁面都在頻繁更新)。

在網站的優化階段,我們可以用Fiddler之類的工具找出一些內容幾乎不會改變的頁面,給它們設定OutputCache, 但是,按照傳統的開發流程,我們需要針對每個頁面檔案執行以下操作:

方式一、使用ASP.NET平臺提供的OutputCache(執行時記憶體)機制

實現方式:

  1. 為列表頁配置輸出快取宣告;
  2. 根據頁面不同的查詢引數快取不同的頁面
    1. E.g.同樣是列表頁,分類1頁面:http://www.wedn.net/cat/1/和 分類二頁面:http://www.wedn.net/cat/2/分別快取成不同的快取物件

優點:

  1. 配置簡單、
  2. 不侵入原本系統、
  3. 訪問速度非常快(因為是將執行結果快取到記憶體)

缺點:

  1. 佔用資源比較多,無法快取所有的頁面。
  2. 另外有個問題:沒有解決使用時間長了以後訪問快取速度變慢;

方式二、同樣使用ASP.NET平臺提供的OutputCache(自定義Provider)機制

實現方式:

  1. 開發自定義Provider程式提供給ASP.NET呼叫去存取輸出快取;
  2. 其餘同方式一

優點:

  1. 可以自主控制快取讀寫、
  2. 不侵入原有系統、
  3. 訪問快

缺點:

  1. 配置相對複雜、
  2. 需要開發Provider
  3. 需要額外的資源(分散式快取)

附:

自定義OutputCacheProvider實現將輸出快取放到分散式快取中

實現原理:

實現方式:

  1. 實現抽象基類OutputCacheProvider的增刪方法;
  2. 附上大概的程式碼(簡單的通過檔案讀寫、JSON序列化和二進位制序列化實現),思路僅供參考:
OutputCacheProvider
  1 using System;
  2 using System.Collections.Generic;
  3 using System.Diagnostics;
  4 using System.IO;
  5 using System.Linq;
  6 using System.Runtime.Serialization.Formatters.Binary;
  7 using System.Security.Cryptography;
  8 using System.Text;
  9 using System.Web.Caching;
 10 using Micua.Utility;
 11 namespace Micua.UI.Cache
 12 {
 13     public class MicuaOutputCacheProvider : OutputCacheProvider, IDisposable
 14     {
 15         readonly IList<CacheItem> _cacheItems;
 16         public MicuaOutputCacheProvider()
 17         {
 18             if (File.Exists("z:\\cache.json"))
 19             {
 20                 var json = File.ReadAllText("z:\\cache.json");
 21                 _cacheItems = JsonHelper.Deserialize<List<CacheItem>>(json) ?? new List<CacheItem>();
 22             }
 23             else
 24             {
 25                 _cacheItems = new List<CacheItem>();
 26             }
 27         }
 28         public override object Get(string key)
 29         {
 30             Debug.WriteLine(string.Format("Cache.Get({0})", key));
 31             key = MD5(key);
 32             var cacheItem = _cacheItems.FirstOrDefault(c => c.Id == key);
 33             if (cacheItem != null)
 34             {
 35                 if (cacheItem.Expiration.ToUniversalTime() <= DateTime.UtcNow)
 36                 {
 37                     _cacheItems.Remove(cacheItem);
 38                 }
 39                 else
 40                 {
 41                     return Deserialize(cacheItem.Item);
 42                 }
 43             }
 44             return null;
 45         }
 46         public override object Add(string key, object entry, DateTime utcExpiry)
 47         {
 48             Debug.WriteLine("Cache.Add({0}, {1}, {2})", key, entry, utcExpiry);
 49             key = MD5(key);
 50             if (utcExpiry == DateTime.MaxValue)
 51                 utcExpiry = DateTime.UtcNow.AddMinutes(5);
 52             var item = _cacheItems.FirstOrDefault(c => c.Id == key);
 53             if (item != null)
 54             {
 55                 if (item.Expiration.ToUniversalTime() <= DateTime.UtcNow)
 56                 {
 57                     _cacheItems.Remove(item);
 58                 }
 59                 else
 60                 {
 61                     SaveChange();
 62                     return Deserialize(item.Item);
 63                 }
 64             }
 65             _cacheItems.Add(new CacheItem
 66             {
 67                 Id = key,
 68                 Item = Serialize(entry),
 69                 Expiration = utcExpiry
 70             });
 71             SaveChange();
 72             return entry;
 73         }
 74         public override void Set(string key, object entry, DateTime utcExpiry)
 75         {
 76             Debug.WriteLine("Cache.Set({0}, {1}, {2})", key, entry, utcExpiry);
 77             key = MD5(key);
 78             var item = _cacheItems.FirstOrDefault(c => c.Id == key);
 79             if (item != null)
 80             {
 81                 _cacheItems.Remove(item);
 82                 item.Item = Serialize(entry);
 83                 item.Expiration = utcExpiry;
 84                 _cacheItems.Add(item);
 85             }
 86             else
 87             {
 88                 _cacheItems.Add(new CacheItem
 89                 {
 90                     Id = key,
 91                     Item = Serialize(entry),
 92                     Expiration = utcExpiry
 93                 });
 94             }
 95             SaveChange();
 96         }
 97         public override void Remove(string key)
 98         {
 99             Debug.WriteLine("Cache.Remove({0})", key);
100             key = MD5(key);
101             _cacheItems.Remove(_cacheItems.FirstOrDefault(c => c.Id == key));
102             SaveChange();
103         }
104         private static string MD5(string value)
105         {
106             var cryptoServiceProvider = new MD5CryptoServiceProvider();
107             var bytes = Encoding.UTF8.GetBytes(value);
108             var builder = new StringBuilder();
109             bytes = cryptoServiceProvider.ComputeHash(bytes);
110             foreach (var b in bytes)
111                 builder.Append(b.ToString("x2").ToLower());
112             return builder.ToString();
113         }
114         private static byte[] Serialize(object entry)
115         {
116             var formatter = new BinaryFormatter();
117             var stream = new MemoryStream();
118             formatter.Serialize(stream, entry);
119             return stream.ToArray();
120         }
121         private static object Deserialize(byte[] serializedEntry)
122         {
123             var formatter = new BinaryFormatter();
124             var stream = new MemoryStream(serializedEntry);
125             return formatter.Deserialize(stream);
126         }
127         private void SaveChange()
128         {
129             var json = JsonHelper.Serialize(_cacheItems);
130             File.WriteAllText("z:\\cache.json", json);
131         }
132         public void Dispose()
133         {
134             var json = JsonHelper.Serialize(_cacheItems);
135             File.WriteAllText("z:\\cache.json", json);
136         }
137     }
138 }

相關推薦

網站優化頁面快取方案

用快取來優化網站效能的方法,估計是無人不知的。 ASP.NET提供了HttpRuntime.Cache物件來快取資料,也提供了OutputCache指令來快取整個頁面輸出。 雖然OutputCache指令使用起來更方便,也有非常好的效果, 不過,它需要我們在那些頁面中新增這樣一個指令。 對於設定過Outpu

網站優化Sitemap

<?xml version="1.0" encoding="UTF-8"?> <urlset>     <url>          <loc>http://www.ab

網站優化meta,img標籤

<title></title>首頁建議使用公司名稱,其他頁面與內容相匹配,內容不同建議使用不同的標題 <meta name='"keywords" content="關鍵字1,關鍵詞2,..."> //為搜尋引擎提供關鍵字列表 <meta name=

網站優化電子商務的目標定位和戰略

對於電子商務這個火爆且飛速變化的行業來說,增加網站建設流量的定位和戰略甚為重要。通過SEO增加產品銷量,這個估計是絕大部門B2C開始要得到的目的,特別是電商低階進入著,並且位置越高要求越輕易提出這個目標。首先來看產品銷量的構成,幾個簡單的公式:產品銷量=新客戶訂單數目新客戶均勻訂單產品數目+老客戶訂單數目老客

oscache 頁面快取例項

快取頁面跟oscache.properties檔案也是有關聯的,需要將oscache.memory設為true 1.快取整個頁面     在OSCache元件中提供了一個CacheFilter用於實現頁面級的快取。主要用於對web應用中的某些動態頁

iOS 效能優化頁面載入速率

前言 之前蒐羅了網上很多關於iOS效能優化方面的資料 ,本人和我的小夥伴們也用了一些時間針對自己的App進行了App的啟動速率、頁面的載入速率和 頁面的幀率方面進行了優化,所以結合了理論和實踐,把我們在實踐中主要踩過的坑和需要注意的東西 ,總結了一下,希望可以

高併發物件快取

為了提高併發能力,可以將資料庫裡面的一些不經常改變的資料快取 在redis中,有效期可以設定 為永久。 但是發生修改該資料時候,要即使更新快取,作為一個原子操作。 比如快取我們的使用者資訊: @Autowired private RedisService redisSer

Mysql學習總結(61)——MySQL優化DBA優化整理彙總

資料庫優化的可以從如下幾個方面著手: 1.>sql語句和索引. 2.>資料庫表結構. 3.>系統配置. 4.>硬體 2.使用MySQL的慢查詢日誌對效率有問題的sql進行監控 1.>檢視慢查詢日誌是否開啟:show variabl

ASP.NET MVC中使用OutputCache實現伺服器端頁面快取注意問題

    CSDN廣告是越來越多了,所有部落格筆記不再更新,新網址 DotNet筆記 1) 血的教訓:先說使用OutputCache實現伺服器端頁面級快取注意問題 在ASP.NET MVC中,假如我們想要將某個頁面(即某個Action)快取在伺服器端,可以在Action上

mysql 資料庫優化 django分表方案

由來這個問題戳到了Django ORM的痛點,對於多資料庫/分庫的問題,Django提供了很好的支援,通過using和db router可以很好的完成多資料庫的操作。但是說到分表的問題,就有點不那麼友好了。但也不是那麼難處理,只是處理起來不太優雅。解析在Django中,資料庫

06.SQLServer效能優化---資料庫日記監控

不清楚的最好看一下,一會要用到。 常規的效能監視有多種,對於我們這些不是DBA的人來說基本上夠用了 第一個是整體的一個監視器 第二個是Profiler,這個挺好的,一般我們都是開發的時候用。真在生產環境下監視就太浪費伺服器效能了(小專案無所謂) 換環境了,以後繼續更

vue專案優化頁面的按需載入(vue+webpack)

vue+webpack實現頁面的按需載入        通過vue寫的單頁應用時,可能會有很多的路由引入。當打包構建的時候,javascript包會變得非常大,影響載入。如果我們能把不同路由對應的元件分割成不同的程式碼塊,然後當路由被訪問的時候才載入對應的元件,這樣就更加高效

自己動手,寫自己的lazyload,讓外掛涼快去——網站優化圖片延時載入

最近一個專案裡,遇到一個這樣的需求:這是一個WEBAPP應用,應用所有的邏輯都聚焦在一個頁面內,客戶要求1.頁面載入速度要快,2頁面響應要快。3.這個頁面只能一屏,不能出現滾動條。因此這個頁面包含了大量的彈出層的操作。 由於這個頁面中,坑爹地包含了136張圖片,主要是很多L

網站優化設定tomcat7開啟Gzip壓縮

測試效果明顯。 文章來源: 今日突然心血來潮用百度站長工具檢測自己的網站質量怎麼樣,驀然發現網站有很多需要改進的地方。也許以前做網站只注重結果而忽略了細節,做了網站後才發現有這麼多技術外的學問,其中一個就是SEO! 今晚探索的就是將伺服器開啟Gzip壓縮。  

網站優化如何讓站群鏈輪做到極致

網際網路的發展帶動中網賺的站長也是越來越多的,前幾年得淘寶客網賺也是發展的很火,做淘寶客的站長們,對於站群操作也是非常熟悉的,站群的操作最重要的是能把站群的鏈輪建設好.網站優化博主也做過站群的操作,給大家說說如何把站群鏈輪做到極致.  第一:選擇站群.在決定了主站需要做鏈輪的

網站優化三大標籤正確寫法

1、標題要一目瞭然 網站標題當作頁面的大腦一點都不為過,尤其是在這個看臉的時代,標題要新穎獨特,通俗易懂,能讓使用者看一眼就知道頁面所表達的內容,當用戶對此感興趣後,才會進網站進行深入瞭解。同時,一個比較獨特的標題也會讓搜尋引擎優先抓取收錄,目前搜尋引擎對稀缺內容越來越

SQLServer效能優化---資料庫日記監控

上節回顧:https://www.cnblogs.com/dotnetcrazy/p/11029323.html 4.6.6.SQLServer監控 指令碼示意:https://github.com/lotapp/BaseCode/tree/master/database/SQL/SQLServer PS:

網站優化使用Free marker靜態化網站文章頁

部落格做出來的時候就想要把一些欄目和文章頁都靜態化處理,當時沒啥時間搞,就一直沒去弄。但是最近的工作就是做網站,用cms快速搭出了幾個網站,cms搭建網站是真的方便啊 如果沒有需要二次開發實現的功能,那基本不需要寫後端程式碼的。而且做出來的還不錯,怪不得看很多博主都是用cms搭建的部落格。 我是用的FreeC

資料庫SQL優化大總結 百萬資料庫面試優化方案

網上關於SQL優化的教程很多,但是比較雜亂。近日有空整理了一下,寫出來跟大家分享一下,其中有錯誤和不足的地方,還請大家糾正補充。 這篇文章我花費了大量的時間查詢資料、修改、排版,希望大家閱讀之後,感覺好的話推薦給更多的人,讓更多的人看到、糾正以及補充。   一、百萬級資料庫優化

資料庫SQL優化大總結 百萬資料庫優化方案

網上關於SQL優化的教程很多,但是比較雜亂。近日有空整理了一下,寫出來跟大家分享一下,其中有錯誤和不足的地方,還請大家糾正補充。 這篇文章我花費了大量的時間查詢資料、修改、排版,希望大家閱讀之後,感覺好的話推薦給更多的人,讓更多的人看到、糾正以及補充。 1.對查詢進行