.net缓存机制

1 web应用程序,有的称为状态管理,有的称为就是缓存管理,缓存机制。

2 分为服务器端缓存和客户端缓存。

3  客户端缓存:

3.1 Cookies:当客户端每次发送请求时都会将它发送到服务端,服务端响应时也会把它发回到客户端。因为它限制了字节数(4096个字节),所以它只能缓存比较小的数据。它可以使用过期策略使它在一段特定的时间之后失效

if (this.Request.Cookies["UserName"] == null) 
{ 
    this.Response.Cookies.Add(new HttpCookie("UserName",  "aaa")); 
} 
else 
{ 
    this.Response.Write(this.Request.Cookies["UserName"].Value); 
}

 3.2 ViewState:和页面相关的数据和控件都是存储在ViewState,ViewState在ASP.NET是隐藏控件的内部实现.功能类似Hidden fields

3.3 页面缓存浏览器缓存和代理缓存,两者设置也很方便,Cache-Control,设置为public就行了,private就只缓存在浏览器

<%@ OutputCache Duration="1800" VaryByParam="*" %>

<%@ OutputCache Duration="3600" VaryByParam="id" %>

在ASP.NET中,要使页面每次访问都必须从服务器端重新加载,而不是从IE缓存中直接读取上次的暂存页,如下实现:

protected void Page_Load(object sender, EventArgs e)
    {
        Response.Buffer = true;
        Response.ExpiresAbsolute = DateTime.Now.AddMinutes(-1);
        Response.Expires = 0;
        Response.CacheControl = "no-cache";
    }

代理缓存的问题,主要出现在三个方面:
1.安全
2.地区问题
3.内容更新问题

首先,对于安全问题,这是最大的问题:因为代理会把根据URL,把整个页面的数据缓存起来,其中就包括了响应头,那么就包含了cookie信息。问题就在 这里啦,如果用户A登录之后,代理缓存了页面的响应,那么用户B在此请求相同的页面的时候,那么整个响应就会给B了,这个时候,用户B就可以以A的身份进 去瞎搞了。
对于这个问题,没有办法解决,但是有办法避免:把一些不需要用户登录就可以访问的页面,特别是那些静态的内容的页面,可以设置代理缓存;涉及到用户验证才能看的页面,不要设置了。

其次,就是地区问题,
因为代理缓存了整个页面,而且是根据URL来匹配的,如果咱们中国人去访问一个页面,例如www.agilesharp.com/blog/12344,这个时候,代理缓存就把这个中文的页面内容缓存,如果我们的站点是支持多语言的,那么,此时,如果美国人去访问了同一个URL,那么这个时候,或许,请求不会提交给我们的服务器,代理就会把中文的页面内容给老美,那叫一个郁闷,是吧。

怎么办?呵呵,方法虽然鲜为人知,但是依然简单。
设置头信息:Accept-Language
在发送中文响应的时候,设置为:Accept-Language: zh-cn,那么代理缓存就会缓存这个版本的内容
如果是请求的英文,那么,老美的浏览器发送的请求的这个Accept-Language的信息就是 en-US,代理一看这样版本的内容没有,那么就会把请求交给我们的服务器了。

最后的结果就是代理中缓存了同一个页面的不同版本的内容。

内容更新问题:因为代理缓存了页面的所有数据,包括图片,js等等,那么即使我们的页面中的图片等更新了,但是客户端是无法知道的,除非缓存的之间过期了,

aa.js?v=2.1

bb.css?v=1.1


4 服务器端缓存:Session,Application就不说了,主要常用的有两种:

4.1:.net缓存:(宿主缓存)在.Net Framework中,应用程序缓存通过System.Web.Caching.Cache类实现,

 当IIS回收频繁的时候,.net缓存会丢失,导致还是频繁的访问数据库,影响性能,所以要和MemCache缓存结合使用。

 关于net缓存和IIS的关系,缓存占用内存达到一定值,所用的资源就会被应用程序池回收,

参考http://www.cnblogs.com/yanyangtian/archive/2012/05/02/2478659.html

4.2:MemCache缓存:(内核缓存)首先要安装MemCache,运行,任务管理器里面会看到MemCache的进程。然后使用。目前主要用来缓存数据库的数据。

memcached中保存的数据都存储在memcached内置的内存存储空间中。 由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失

这种缓存是一种分布式的,也就是可以允许不同主机上的多个用户同时访问这个缓存系统,这种方法不仅解决了共享内存只能是单机的弊端,同时也解决了数据库检 索的压力,最大的优点是提高了访问获取数据的速度,Memcached用于在动态应用中减少数据库负载,提升访问速度,但是用来加速Web应用、降低数据 库负载时比较多。Memcached也完全可以用到其他地方,比如分布式数据库,分布式计算等领域

web.config配置如下:

   <!--MemCache配置(缓存池名称)-->
  <add key="MemPoolName" value="poolName" />
  <!--MemCache配置(服务器列表)-->
  <add key="MemServer" value="17.0.0.0:11211" />
  <!--MemCache配置(是否开启 1开启)-->
  <add key="MemEnabledCache" value="1" />

 

 

 

原文地址:https://www.cnblogs.com/judy0605/p/2727681.html