因为网站最重要的用户体验就是速度,特别是对于电子商务网站而言。html
通常网站速度优化会涉及到几个方面:前端
1. 数据库优化 — 查询字段简历索引,使用数据库链接池和持久化,如今还有种趋势,就是选择使用No SQL做为补充;数据库
2. 数据缓存 — 使用Memcached等;缓存
3. 负载均衡 — 使用ngnix等负载均衡
4. 页面缓存 — 将.aspx, .jsp等动态页面缓存或静态化为.html页面前端优化
5. 前端优化 — Yahoo 14条前端优化原则。jsp
城江湖(Incity.me)针对 2 数据缓存, 4 页面静态化, 5 Yahoo 14条优化原则作了具体的实践,并得到了实际效果,之后的系列文章会举出一些实践方法和列出部分代码,此次主要针对页面缓存进行说明。优化
以InCity为例,首页,商品分类,帮助中心等都是用于展现商品和网站信息的,与用户的交互相对较少。在某个时间段内(1小时),全部用户看到的页面都应该是相同的, 并不会由于不一样的用户而显示不一样的信息。网站
InCity是基于ASP.NET MVC开发的,熟悉ASP.NET MVC的童鞋都知道,ASP.NET MVC自带了一个属性叫OutputCache, 最经常使用的是Duration和VaryByParam两个参数:htm
MSDN:
Duration:表示页或用户控件进行缓存的时间(以秒计)
VaryByParam:分号分隔的字符串列表,用于使输出缓存发生变化。
Code:
[OutputCache(Duration="3600" VaryByParam="type")]
public ActionResult Catalog(string type)
解释一下:
1. 用户第一次输入http://incity.me/catalog/food,从后台获取,并为catalog/food生成缓存页面,3600秒内缓存页面有效。
2. 用户再次输入http://incity.me/catalog/food,从缓存页面获取。
3. 当用户第一次输入http://incity.me/catalog/play的时候,由于{type}从food变成了play,数据从后台获取,并为catalog/play生成缓存代码3600秒内有效。
4.用户再次输入http://incity.me/catalog/play,从缓存页面获取。
上述的解决方法对于大部分均可以处理,可是若是遇到下面的状况怎么办?登陆前首页右侧的面板是显示登陆区,登陆后是显示用户信息,而首页若是采用OutputCache全局页面缓存的话,则右侧显示不一样的帐户信息的。由于前面咱们已经提到,在某个时间段内(1小时),全部用户看到的页面都应该是相同的。
登陆前:
登陆后:
这时候就须要针对左侧的商品做局部缓存,而对右侧不使用缓存。如何达到这个效果呢?遗憾的是,这时候微软官方的ASP.NET MVC并未提供这种功能,所以参考使用了PartOutputCache,用法以下:
[PartOutputCache(CacheDuration = 3600)]
public ActionResult ShowCase()
aspx页面代码则变成了
<div id=”Container”>
<!–使用了缓存–>
<%Html.RenderAction<HomeController>(p => p.IndexShowCase());%>
<!–没有使用缓存–>
<%Html.RenderAction<HomeController>(p => p.LoginPanel());%>
</div>