ASP.NET性能優(yōu)化之局部緩存分析
1:頁(yè)面含熱點(diǎn)新聞,熱點(diǎn)新聞部分需要10分鐘更新一次,而整個(gè)頁(yè)面的其它部分1天內(nèi)都不會(huì)變動(dòng);
2:首頁(yè)的某個(gè)BANNER需要顯式:歡迎***;
上面場(chǎng)景中的1,如果整個(gè)頁(yè)面的緩存失效都定為10分鐘,則勢(shì)必增加性能開(kāi)銷(xiāo),所以最好的策略是頁(yè)面的不同部分采用不同的緩存失效時(shí)長(zhǎng)。對(duì)于場(chǎng)景2也一樣,我們不應(yīng)該為了遷就某個(gè)BANNER不能應(yīng)用緩存,就讓整個(gè)頁(yè)面都不支持緩存。
可以說(shuō),如果我們?cè)陂_(kāi)發(fā)網(wǎng)站過(guò)程中的緩存策略是不支持頁(yè)面局部緩存的,整個(gè)架構(gòu)就是不合理的。
一:局部緩存常用解決方案
針對(duì)上面的需求,有幾類(lèi)解決方案:
1、Client Side Includes(CSI):通過(guò)frame、iframe、 javascript、javacript+ajax等方式將另外一個(gè)頁(yè)面的內(nèi)容動(dòng)態(tài)包含進(jìn)來(lái)。像現(xiàn)在流行的jquery等javascript庫(kù)對(duì)此有較好的支持。
優(yōu)點(diǎn):能夠利用瀏覽器客戶(hù)端并行處理及裝載的機(jī)制;通過(guò)瀏覽器緩存機(jī)制可以降低網(wǎng)絡(luò)傳輸時(shí)間,提高性能;計(jì)算放在客戶(hù)端,能夠降低服務(wù)器端壓力
缺點(diǎn):搜索引擎優(yōu)化問(wèn)題;javascript兼容性問(wèn)題;客戶(hù)端緩存可能導(dǎo)致服務(wù)器端內(nèi)容更新后不能及時(shí)生效;XSS等安全隱患
2、Server Side Includes(SSI):
優(yōu)點(diǎn):SSI技術(shù)是通用技術(shù),不受具體語(yǔ)言限制,只需要Web服務(wù)器或應(yīng)用服務(wù)器支持即可,Ngnix、Apache、Tomcat、Jboss等對(duì)此都有較好的支持
缺點(diǎn):SSI在語(yǔ)法上不能夠直接包含其他服務(wù)器的url(當(dāng)然也可以通過(guò)redirect等來(lái)變通實(shí)現(xiàn)),因此在需要充分利用緩存及負(fù)載均衡的環(huán)境下相對(duì)不是很靈活。
當(dāng)然如果不使用單獨(dú)的緩存服務(wù)器,而是使用Ngnix,利用Ngnix對(duì)SSI及Memcached支持,通過(guò)NginxHttpSsiModule、 NginxHttpMemcachedModule也可以實(shí)現(xiàn)頁(yè)面緩存,但與專(zhuān)業(yè)的緩存服務(wù)器(例如Varnish)相比較,Ngnix作為緩存服務(wù)器只適合于中小規(guī)模的場(chǎng)合。
3、使用ASP.NET的片段緩存
可以利用用戶(hù)控件將頁(yè)面分段,在ascx文件中寫(xiě)入緩存的語(yǔ)句,而不在aspx文件中寫(xiě)緩存語(yǔ)句,這樣ASP.NET就可以只緩存ascx片斷的輸出了。
缺點(diǎn):片段緩存不支持Location特性;緩存頁(yè)面片段惟一合法的地方是web服務(wù)器。這是因?yàn)槠尉彺嬖贏SP.NET中是新的功能,所以瀏覽器和代理服務(wù)器不支持。由于它不是W3C標(biāo)準(zhǔn),像SQUID和VARNISH這樣的代理服務(wù)器也不支持它。
4、Edge Side Includes (ESI):
Edge Side Includes(ESI) 和Server Side Includes(SSI) 和功能類(lèi)似。SSI需要特殊的文件后綴(shtml,inc)。ESI可以直接通過(guò)URI包含遠(yuǎn)程服務(wù)器文件,ESI更適合用于緩存服務(wù)器上,緩存整個(gè)頁(yè)面或頁(yè)面片段,因此ESI特別適合用于緩存。本文要介紹的就是ESI的方式來(lái)支持局部緩存。
優(yōu)點(diǎn):ESI是一個(gè)W3C標(biāo)準(zhǔn),被當(dāng)下流行的緩存服務(wù)器SQUID,Varnish支持。
二:ESI的ASP.NET實(shí)現(xiàn)
本文所要闡述的是ESI局部緩存的實(shí)現(xiàn)。主頁(yè)面(test1.aspx)前臺(tái):
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="test1.aspx.cs" Inherits="WebApplication2.aspx.test1" %>
<%@ Import Namespace="System.Globalization" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<div>這里是局部緩存</div>
<esi:include src="test2.aspx"/>
<div>局部緩存結(jié)束</div>
<%=DateTime.Now.ToString("U", DateTimeFormatInfo.InvariantInfo)%>
</body>
</html>
主頁(yè)面的后臺(tái)請(qǐng)參看上篇,對(duì)主頁(yè)面采取了緩存策略,即在頁(yè)面中使用esi:include標(biāo)識(shí)。
被包含的頁(yè)面(test2.aspx)的前臺(tái):
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="test2.aspx.cs" Inherits="WebApplication2.aspx.test2" %>
<%@ Import Namespace="System.Globalization" %>
<div>
局部緩存中的頁(yè)面:
<%=DateTime.Now.ToString("U", DateTimeFormatInfo.InvariantInfo)%>
</div>
被包含的頁(yè)面的后臺(tái)什么也不需要處理,也就是不為它加入任何緩存策略,該頁(yè)面是實(shí)時(shí)的。
VARNISH配置文件如下:
backend default {
.host = "192.168.0.77";
.port = "80";
}
sub vcl_fetch {
remove beresp.http.Set-Cookie;
if(req.url ~ "test1.aspx") {
esi;
}
if(req.url ~ "test2.aspx"){
return (pass);
}
}
sub vcl_recv {
remove req.http.Cookie;
#remove req.http.Accept-Encoding;
#remove req.http.Vary;
}
sub vcl_hit {
if(req.http.Cache-Control~"no-cache"||req.http.Cache-Control~"max-age=0"||req.http.Pragma~"no-cache"){
set obj.ttl=0s;
return (restart);
}
return (deliver);
}
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT";
} else {
set resp.http.X-Cache = "MISS";
}
}
上文的vcl_fetch函數(shù)中加了兩個(gè)判斷,指的是:如果碰到test1.aspx就處理esi標(biāo)識(shí),如果碰到test2.aspx,就直接忽略讓后臺(tái)IIS處理。
值得注意的是,啟動(dòng)命令中加入了-p選項(xiàng)(這是一個(gè)varnish的小問(wèn)題,請(qǐng)查閱參考,此處不表):
varnishd -a :8011 -T :8088 -f c:/varnish/etc/default.vcl -p esi_syntax=0x1 -s file,c:/varnish/var/cache,100M
三:效果
啟動(dòng)varnish后,我們發(fā)現(xiàn),對(duì)于test2.aspx,由于我們使用了esi對(duì)其進(jìn)行了包含,而test2.aspx又未進(jìn)行緩存,所以在test1.aspx的緩存有效期內(nèi),隨著每一次刷新,test1.aspx的內(nèi)容沒(méi)有變動(dòng),但是所包含的test2.aspx區(qū)域,會(huì)實(shí)時(shí)刷新。
參考(第一小節(jié)大部分來(lái)自參考文字):
https://www.varnish-cache.org/trac/ticket/352
http://cd34.com/blog/infrastructure/no-esi-processing-first-char-not/
http://hi.baidu.com/chuanliang2007/blog/item/075f67963e20f315d31b7035.html
相關(guān)文章
asp.net實(shí)現(xiàn)圖片以二進(jìn)制流輸出的兩種方法
這篇文章主要介紹了asp.net實(shí)現(xiàn)圖片以二進(jìn)制流輸出的兩種方法,以簡(jiǎn)單實(shí)例形式分析了asp.net實(shí)現(xiàn)以二進(jìn)制流形式讀寫(xiě)圖片文件的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-12-12
asp.net Forms身份驗(yàn)證和基于角色的權(quán)限訪(fǎng)問(wèn)
Forms身份驗(yàn)證用來(lái)判斷是否合法用戶(hù),當(dāng)用戶(hù)合法后,再通過(guò)用戶(hù)的角色決定能訪(fǎng)問(wèn)的頁(yè)面。2009-09-09
Entity Framework使用Code First模式管理視圖
本文詳細(xì)講解了Entity Framework使用Code First模式管理視圖的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03
asp.net mvc CodeFirst模式數(shù)據(jù)庫(kù)遷移步驟詳解
這篇文章主要為大家詳細(xì)介紹了asp.net mvc CodeFirst模式數(shù)據(jù)庫(kù)遷移步驟,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10
.net core項(xiàng)目中常用的幾款類(lèi)庫(kù)詳解(值得收藏)
這篇文章主要給大家介紹了關(guān)于.net core項(xiàng)目中常用的幾款類(lèi)庫(kù)的相關(guān)資料,文章通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用.net core具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-04-04
asp.net url重寫(xiě)后頁(yè)面回傳問(wèn)題
最近在做項(xiàng)目時(shí)遇到了URL重寫(xiě)后當(dāng)頁(yè)面回傳時(shí),url又刷回原值;這個(gè)問(wèn)題困擾了很久,終于找到解決辦法了。2009-11-11
基于ASP.NET+easyUI框架實(shí)現(xiàn)圖片上傳功能(表單)
這篇文章主要介紹了基于ASP.NET+easyUI框架實(shí)現(xiàn)圖片上傳功能的相關(guān)資料,需要的朋友可以參考下2016-06-06
ASP.NET MVC中使用Bundle打包壓縮js和css的方法
這篇文章主要為大家詳細(xì)介紹了ASP.NET MVC中使用Bundle打包壓縮js和css的方法,感興趣的小伙伴們可以參考一下2016-05-05
ASP.NET Core針對(duì)一個(gè)使用HttpClient對(duì)象的類(lèi)編寫(xiě)單元測(cè)試詳解
這篇文章主要給大家介紹了關(guān)于ASP.NET Core中如何針對(duì)一個(gè)使用HttpClient對(duì)象的類(lèi)編寫(xiě)單元測(cè)試的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-01-01

