網站優化之頁面級快取方案
用快取來優化網站效能的方法,估計是無人不知的。 ASP.NET提供了HttpRuntime.Cache物件來快取資料,也提供了OutputCache指令來快取整個頁面輸出。 雖然OutputCache指令使用起來更方便,也有非常好的效果, 不過,它需要我們在那些頁面中新增這樣一個指令。
對於設定過OutputCache的頁面來說,瀏覽器在收到這類頁面的響應後,會將頁面響應內容快取起來。 只要在指定的快取時間之內,且使用者沒有強制重新整理的操作,那麼就根本不會再次請求服務端, 而對於來自其它的瀏覽器發起的請求,如果快取頁已生成,那麼就可以直接從快取中響應請求,加快響應速度。 因此,OutputCache指令對於效能優化來說,是很有意義的(除非所有頁面頁面都在頻繁更新)。
在網站的優化階段,我們可以用Fiddler之類的工具找出一些內容幾乎不會改變的頁面,給它們設定OutputCache, 但是,按照傳統的開發流程,我們需要針對每個頁面檔案執行以下操作:
方式一、使用ASP.NET平臺提供的OutputCache(執行時記憶體)機制
實現方式:
- 為列表頁配置輸出快取宣告;
- 根據頁面不同的查詢引數快取不同的頁面
- E.g.同樣是列表頁,分類1頁面:http://www.wedn.net/cat/1/和 分類二頁面:http://www.wedn.net/cat/2/分別快取成不同的快取物件
優點:
- 配置簡單、
- 不侵入原本系統、
- 訪問速度非常快(因為是將執行結果快取到記憶體)
缺點:
- 佔用資源比較多,無法快取所有的頁面。
- 另外有個問題:沒有解決使用時間長了以後訪問快取速度變慢;
方式二、同樣使用ASP.NET平臺提供的OutputCache(自定義Provider)機制
實現方式:
- 開發自定義Provider程式提供給ASP.NET呼叫去存取輸出快取;
- 其餘同方式一
優點:
- 可以自主控制快取讀寫、
- 不侵入原有系統、
- 訪問快
缺點:
- 配置相對複雜、
- 需要開發Provider
- 需要額外的資源(分散式快取)
附:
自定義OutputCacheProvider實現將輸出快取放到分散式快取中
實現原理:
實現方式:
- 實現抽象基類OutputCacheProvider的增刪方法;
- 附上大概的程式碼(簡單的通過檔案讀寫、JSON序列化和二進位制序列化實現),思路僅供參考:
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.對查詢進行