本文主要介绍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