服务器缓存
缓存可以在客户端和服务器中做,要是之间还有代理,代理也可能对响应进行缓存。
代理是将客户端和服务器连接在一起,作为中间人角色,可以将客户端请求响应的内容进行缓存,
在下次客户端缓存时,代理直接返回缓存结果,提高性能。
代理缓存控制是在http头信息中cache-Control设置,当设成private时,代理不会进行缓存,
当设置为public时,代理可以进行缓存。我们可以用编程方式:
void SetPublicCache()
{
TimeSpan ts = TimeSpan.FromSeconds(60);
this.Response.Cache.SetMaxage(ts);//设置过期时间
this.Response.Cache.SetNoServerCaching();//关闭服务器输出缓存
}
还可以使用OutPutCache命令:
<%@outputcache Duration="60" Location="DownStream" VaryByParam="None"%>
服务器缓存:包含内核缓存,IIS缓存,ASP.NET输出缓存,ASP.NET对象缓存,数据库缓存等
windows内核缓存:当客户端http请求到达服务器,肯定是先进windows内核模块,
然后进行一些处理,把请求委托给IIS,IIS在委托给ASP.NET应用程序,这是大致的一个过程。
windows包含一个内核模块的HTTP驱动,名为http.sys,HTTP协议在windows内核中提供了支持,提高了性能和灵活性。内核HTTP缓存默认为静态文件打开,对动态文件默认关闭。
可以启动动态内容的缓存:
<%@outputcache Duration="60" VaryByParam="None"%>
这句话也会同时启动ASPNET输出缓存。
编程方式启动:
void SetPublicCache()
{
TimeSpan ts = TimeSpan.FromSeconds(60);
this.Response.Cache.SetMaxage(ts);//设置过期时间
this.Response.Cache.SetCacheability(HttpCacheability.Public);
}
内核缓存,会占用内核内存,是稀有资源,在120秒内没有命中缓存,就会被移除。
在内核缓存下面的是IIS输出缓存,可以根据查询字符串进行缓存,这是内核缓存不具备的。
再下面就是ASP.NET输出缓存:独立于IIS输出缓存,还可以根据参数改变输出,设置方式和上面是一样的,ASP.NET输出缓存还可以使用在用户控件之上,而页面可以不设置缓存。
关闭方法:this.Response.Cache.SetNoServerCaching();//关闭服务器输出缓存
还可以从输出缓存中显示指定移除项:
HttpResponse.RemoveOutPutCacheItem("/pages/default.aspx");
ASP.NET对象缓存
可以使用静态变量缓存对象,但是是常住内容,占用内存。还可以使用HttpContext.Application对象,使用它可以实现延迟初始化,有利于整体性能。例:
HttpApplicationState app = this.Context.Application;
string myvalue = null;
app.Lock();
try
{
myvalue = (string)app["key"];
if(myvalue == null)
{
myvalue = "value";
app["key"] = myvalue;
}
}
finally
{
app.unlock();
}
因为这种方式变量是多个线程可以访问的,保证一致性状态,对象本身实现的lock方法,可以运用。
缓存只在当前请求中使用的对象
应用HttpContext.Items缓存当前请求中需要的对象,请求结束后会销毁:
this.Context.Items["key"] = "value";
使用场景是用户控件之间共享数据,httpModule与页面之间交互机制。
可以使用HttpContext.Cache缓存不止一个用户需要且由多个页面请求的对象。
使用:
public Static Object lockObject = new object();
lock(lockObject)
{
if(this.cache["key"] == null)
{
this.cache["key"] = "value";
}
}
还可以指定运行时保留的时间
if(this.Cache["key"] == null)
{
this.Cache.Add("key","value",null,DateTime.Now.AddSeconds(60),CacheItemPriority.High,null);//指定时间,是否滑动过期,等级是否高
}
还可以让缓存依赖于文件:
public class XmlDepend
{
public static object lockobject = new object();
public static XmlDocument MyDocument(string path)
{
string key = "mydoc:"+path;
Cache cache = HttpContext.Current.Cache;
lock(lockobject)
{
xmlDocument doc = (XmlDocument)Cache[key];
if(doc==null)
{
doc = new XmlDocument();
doc.Load(path);
CacheDependency cd = new CacheDependency(path);
cache.Insert(key,doc,cd);
}
return doc;
}
}
}
这会将一个xml文件路径给方法,用它构造一个缓存键,如果xmlDocument仍然在缓存中则返回它,否则就从硬盘加载,并创建缓存依赖,当xml文件被修改时,它会通知,并移除xmldocument的存环对象。