本文主要介紹Web窗體頁面中的使用方法,MVC中使用方法,你們自行百度。
1、簡單一行指令便可實現 瀏覽器
<%@ OutputCache VaryByParam="none" Duration="300" %>
這樣整個頁面就被緩存了,因爲我是首頁進行的緩存,沒有任何參數因此VaryByParam值設置爲none,若是但願經過指定的參數來緩存內容能夠設置"id;classid"這種形式,或者乾脆就用"*",經過全部參數來緩存內容。
2、緩存先後性能對比
使用ab模擬100個用戶1000次併發,先後結果以下:
如上圖所示,加了緩存以後,吞吐量大約增大了10倍,每次請求的處理時間縮小到原來的十分之一左右,性能明顯提高。
3、OutputCache的BUG
這個bug伴隨.NET1.0到4.0,就是OutputCache會忽略瀏覽器的緩存,本人用的是.NET 4.0,微軟官方說已經完美解決,可是實測bug依然存在,具體表現是:
1.VaryByParam設置爲none時,沒有bug,F5刷新狀態碼每次都是304緩存
2.VaryByParam設置爲*或其餘值時,每次按F5刷新狀態碼每次都是200服務器
注:這個時候雖然瀏覽器沒有幫助咱們緩存頁面,每次請求都是從服務器請求,可是服務器端是將頁面緩存了的,因此用ab測試效率依然是很高的。固然若是瀏覽器幫助咱們緩存,壓根就不會產生此次請求了。
3.解決方法就是在Page_Load中加以下代碼
併發
Response.Cache.SetOmitVaryStar(true);
這樣客戶端瀏覽器就實現了緩存,除非強制刷新,會再次從服務器端請求數據。
4、局部緩存數據,使部分數據不被緩存
這個就太常見了,咱們總不但願登陸狀態也被緩存吧,假設頁面沒作任何改進,你登陸以前是【登陸】【註冊】這種按鈕,當你登陸後依然顯示【登陸】【註冊】這確定是不妥的,那麼咱們但願這部份內容不被緩存,那咱們就要用到Substitution控件。
在頁面中放置Substitution控件函數
<asp:Substitution ID="subLoginStatus" runat="server" MethodName="GetLoginStatus"/>
在後臺cs文件中添加函數GetLoginStatus工具
public static string GetLoginStatus(HttpContext context) { if (context.Session["usr"] != null) { return context.Session["usr"].ToString() + "歡迎您的登陸"; } else { return "【登陸】【註冊】"; } }
這樣頁面其餘部分都被緩存,只有登陸狀態是每次都動態讀取的。
注:因爲頁面中有一部分是動態的,因此每次請求的狀態碼都是200。
5、OutputCache失效的問題
網上有說Cookie和Cache衝突,你們自行檢查,我在作的時候也確實遇到了OutputCache失效的問題,排查代碼發現,包含以下代碼性能
<script language="C#" runat="server"> string siteId = "ab71a8cfda50fbfeb2d3f6ee182af524"; </script> <!-- #include file="hm.aspx" --> <% string ret = TrackPageView(); %> <div style="display:none;"><img src="<%= ret %>" width="0" height="0"/></div>
這段代碼是百度的統計代碼,去掉以後解決。若是確實想加百度的統計,能夠替換以下相似代碼:測試
<div style="display:none;"> <script> var _hmt = _hmt || []; (function () { var hm = document.createElement("script"); hm.src = "//hm.baidu.com/hm.js?ab71a8cfda50fbfeb2d3f6ee182af524"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script> </div>
附件下載:ApacheBench(ab)壓力測試工具(Windows版)spa