ASP.NET性能优化之局部缓存

开发 后端
今天我们将谈到ASP.NET性能优化方面的问题,局部缓存的作用是为了解决某个特定区域需要经常更新,而其他区域更新不明显的问题。

  在网站的开发过程中,经常碰到的一类需求场景是:

  1:页面含热点新闻,热点新闻部分需要10分钟更新一次,而整个页面的其它部分1天内都不会变动;

  2:首页的某个BANNER需要显式:欢迎***;

  上面场景中的1,如果整个页面的缓存失效都定为10分钟,则势必增加性能开销,所以***的策略是页面的不同部分采用不同的缓存失效时长。对于场景2也一样,我们不应该为了迁就某个BANNER不能应用缓存,就让整个页面都不支持缓存。

  可以说,如果我们在开发网站过程中的缓存策略是不支持页面局部缓存的,整个架构就是不合理的。

  一:局部缓存常用解决方案

  针对上面的需求,有几类解决方案:

  1、Client Side Includes(CSI):通过frame、iframe、 javascript、javacript+ajax等方式将另外一个页面的内容动态包含进来。像现在流行的jquery等javascript库对此有较好的支持。

  优点:能够利用浏览器客户端并行处理及装载的机制;通过浏览器缓存机制可以降低网络传输时间,提高性能;计算放在客户端,能够降低服务器端压力

  缺点:搜索引擎优化问题;javascript兼容性问题;客户端缓存可能导致服务器端内容更新后不能及时生效;XSS等安全隐患

  2、Server Side Includes(SSI):

  优点:SSI技术是通用技术,不受具体语言限制,只需要Web服务器或应用服务器支持即可,Ngnix、Apache、Tomcat、Jboss等对此都有较好的支持

  缺点:SSI在语法上不能够直接包含其他服务器的url(当然也可以通过redirect等来变通实现),因此在需要充分利用缓存及负载均衡的环境下相对不是很灵活。

  当然如果不使用单独的缓存服务器,而是使用Ngnix,利用Ngnix对SSI及Memcached支持,通过NginxHttpSsiModule、 NginxHttpMemcachedModule也可以实现页面缓存,但与专业的缓存服务器(例如Varnish)相比较,Ngnix作为缓存服务器只适合于中小规模的场合。

  3、使用ASP.NET的片段缓存

  可以利用用户控件将页面分段,在ascx文件中写入缓存的语句,而不在aspx文件中写缓存语句,这样ASP.NET就可以只缓存ascx片断的输出了。

  缺点:片段缓存不支持Location特性;缓存页面片段惟一合法的地方是web服务器。这是因为片段缓存在ASP.NET中是新的功能,所以浏览器和代理服务器不支持。由于它不是W3C标准,像SQUID和VARNISH这样的代理服务器也不支持它。

  4、Edge Side Includes (ESI):

  Edge Side Includes(ESI) 和Server Side Includes(SSI) 和功能类似。SSI需要特殊的文件后缀(shtml,inc)。ESI可以直接通过URI包含远程服务器文件,ESI更适合用于缓存服务器上,缓存整个页面或页面片段,因此ESI特别适合用于缓存。本文要介绍的就是ESI的方式来支持局部缓存。

  优点:ESI是一个W3C标准,被当下流行的缓存服务器SQUID,Varnish支持。

  二:ESI的ASP.NET实现

  本文所要阐述的是ESI局部缓存的实现。主页面(test1.aspx)前台:

  1.   <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="test1.aspx.cs" Inherits="WebApplication2.aspx.test1" %> 
  2.   <%@ Import Namespace="System.Globalization" %> 
  3.   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
  4.   <html xmlns="http://www.w3.org/1999/xhtml"> 
  5.   <head runat="server"> 
  6.   <title></title> 
  7.   </head> 
  8.   <body> 
  9.   <div>这里是局部缓存</div> 
  10.   <esi:include src="test2.aspx"/> 
  11.   <div>局部缓存结束</div> 
  12.   <%=DateTime.Now.ToString("U", DateTimeFormatInfo.InvariantInfo)%> 
  13.   </body> 
  14.   </html> 

  主页面的后台请参看上篇,对主页面采取了缓存策略,即在页面中使用esi:include标识。

  被包含的页面(test2.aspx)的前台:

  1.   <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="test2.aspx.cs" Inherits="WebApplication2.aspx.test2" %> 
  2.  <%@ Import Namespace="System.Globalization" %> 
  3.   <div> 

  局部缓存中的页面:

 

  1.   <%=DateTime.Now.ToString("U", DateTimeFormatInfo.InvariantInfo)%> 
  2.   </div> 

 

  被包含的页面的后台什么也不需要处理,也就是不为它加入任何缓存策略,该页面是实时的。

  VARNISH配置文件如下:

  1.   backend default {  
  2.   .host = "192.168.0.77";  
  3.   .port = "80";  
  4.   }  
  5.   sub vcl_fetch {  
  6.   remove beresp.http.Set-Cookie;  
  7.   if(req.url ~ "test1.aspx") {  
  8.   esi;  
  9.   }  
  10.   if(req.url ~ "test2.aspx"){  
  11.   return (pass);  
  12.   }  
  13.   }  
  14.   sub vcl_recv {  
  15.   remove req.http.Cookie;  
  16.   #remove req.http.Accept-Encoding;  
  17.   #remove req.http.Vary;  
  18.   }  
  19.   sub vcl_hit {  
  20.   if(req.http.Cache-Control~"no-cache"||req.http.Cache-Control~"max-age=0"||req.http.Pragma~"no-cache"){  
  21.   set obj.ttl=0s;  
  22.   return (restart);  
  23.   }  
  24.   return (deliver);  
  25.   }  
  26.   sub vcl_deliver {  
  27.   if (obj.hits >0) {  
  28.   set resp.http.X-Cache = "HIT";  
  29.   } else {  
  30.   set resp.http.X-Cache = "MISS";  
  31.   }  
  32.   } 

  上文的vcl_fetch函数中加了两个判断,指的是:如果碰到test1.aspx就处理esi标识,如果碰到test2.aspx,就直接忽略让后台IIS处理。

  值得注意的是,启动命令中加入了-p选项(这是一个varnish的小问题,请查阅参考,此处不表):

  varnishd -a :8011 -T :8088 -f c:/varnish/etc/default.vcl -p esi_syntax=0x1 -s file,c:/varnish/var/cache,100M

  三:效果

  启动varnish后,我们发现,对于test2.aspx,由于我们使用了esi对其进行了包含,而test2.aspx又未进行缓存,所以在test1.aspx的缓存有效期内,随着每一次刷新,test1.aspx的内容没有变动,但是所包含的test2.aspx区域,会实时刷新。

  参考(***小节大部分来自参考文字):

原文:http://www.cnblogs.com/luminji/archive/2011/10/19/2181531.html

【编辑推荐】

  1. ASP.NET MVC会成为ASP.NET未来主流的UI平台?
  2. ASP.NET性能优化之构建自定义文件缓存
  3. 想爱容易相处难:当ASP.NET MVC爱上IoC
  4. 导致ASP.NET站点重启的十大原因
  5. 浅谈ASP.NET核心对象
责任编辑:彭凡 来源: 博客园
相关推荐

2011-10-17 09:54:18

ASP.NET性能

2012-05-16 10:24:26

ASP.NET性能优化

2009-08-13 16:22:18

ASP.NET性能优化

2009-08-13 15:49:18

ASP.NET性能优化

2011-09-08 13:56:41

ASP.NET性能

2024-06-11 09:00:00

异步编程代码

2009-08-03 18:47:12

ASP.NET数据缓存

2011-02-13 09:37:55

ASP.NET

2009-02-23 15:55:29

ASP.NET.NET性能提升

2011-02-22 09:16:24

高性能ASP.NET

2009-07-29 15:38:01

2009-07-31 10:23:44

缓存页面ASP.NET缓存

2009-07-28 17:17:19

ASP.NET概述

2011-02-17 09:13:57

ASP.NET

2021-05-19 08:04:11

ASP.Net服务性原则

2011-07-06 08:46:30

2011-06-28 15:14:10

ASP.NET性能优化

2018-02-23 13:55:16

ASP.NET性能优化技巧

2009-08-04 15:22:33

ASP.NET缓存机制

2009-07-31 10:33:54

ASP.NET页面输出
点赞
收藏

51CTO技术栈公众号