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" />