服务器缓存

缓存可以在客户端和服务器中做,要是之间还有代理,代理也可能对响应进行缓存。
代理是将客户端和服务器连接在一起,作为中间人角色,可以将客户端请求响应的内容进行缓存,

在下次客户端缓存时,代理直接返回缓存结果,提高性能。
代理缓存控制是在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

可以使用静态变量缓存对象,但是是常住内容,占用内存。还可以使用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

缓存只在当前请求中使用的对象
应用HttpContext.Items缓存当前请求中需要的对象,请求结束后会销毁:

 

this.Context.Items["key"] = "value";

使用场景是用户控件之间共享数据,httpModule与页面之间交互机制。

 

HttpContext.Cache

 

可以使用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的存环对象。



posted @ 2012-11-27 16:39  八神吻你  阅读(5918)  评论(1编辑  收藏  举报