Asp.net中的Cache--HttpRuntim.Cache 和 HttpContext.Current.Cache

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Asp.net中的Cache--HttpRuntim.Cache 和 HttpContext.Current.Cache相关的知识,希望对你有一定的参考价值。

在ASP.NET中有两个类都提供缓存支持, 一个是HttpRuntime类的Cache属性, 另一个是HttpContext类的Cache属性. 通过查看这两个属性的类型可以发现其实这两个属性都是System.Web.Caching.Cache类的实例.那为什么需要同时提供两种支持呢? 查询MSDN后发先,这两个缓存的应用的场景不一样, HttpRuntime.Cache是应用程序级别的缓存, HttpContext.Current.Cache是针对Web上下文定义的, 是一个局部的缓存.(这段话需要进一步求证)

缓存的作用
ASP.NET是一种动态页面技术,用ASP.NET技术做出来的网页几乎都是动态的,所谓动态是指:页面的内容会随着不同的用户或者持续更新的数据, 而呈现出不同的显示结果。既然是动态的,那么这些动态的内容是从哪里来的呢?我想绝大多数网站都有自己的数据源, 程序通过访问数据源(如数据库系统, 文件系统)获取页面所需的数据,然后根据一些业务规则的计算处理,最后变成适合页面展示的内容。

由于这种动态页面技术通常需要从数据源获取数据,并经过一些计算逻辑,最终变成一些html代码发给客户端显示。而这些计算过程显然也是有成本的。 这些处理成本最直接可表现为影响服务器的响应速度,尤其是当数据的处理过程变得复杂以及访问量变大时,会变得比较明显。 另一方面,有些数据并非时刻在发生变化,如果我们可以将一些变化不频繁的数据的最终计算结果(包括页面输出)缓存起来, 就可以非常明显地提升程序的性能,缓存的最常见且最重要的用途就体现在这个方面。 这也是为什么一说到性能优化时,一般都将缓存摆在第一位的原因。 我今天要说到的ASP.NET Cache也是可以实现这种缓存的一种技术。 不过,它还有其它的一些功能,有些是其它缓存技术所没有的。

缓存的用法
创建缓存和读取缓存, 这是缓存的基本用法. 读取缓存通过Cache.Get(key) 或 Cache[key], 而创建缓存的方式有两种Add和Insert, 这两种方式的差别在与: 当要创建的缓存已经存在时, Insert会覆盖原有的缓存项, 而Add不会.

缓存的过期时间
ASP.NET支持二种缓存项的过期策略:绝对过期和滑动过期。

1. 绝对过期,这个容易理解:就是在缓存放入Cache时,指定一个具体的时间。当时间到达指定的时间的时,缓存项自动从Cache中移除。
2. 滑动过期:某些缓存项,我们可能只希望在有用户在访问时,就尽量保留在缓存中,只有当一段时间内用户不再访问该缓存项时,才移除它, 这样可以优化内存的使用,因为这种策略可以保证缓存的内容都是【很热门】的。 操作系统的内存以及磁盘的缓存不都是这样设计的吗?而这一非常有用的特性,Cache也为我们准备好了,只要在将缓存项放入缓存时, 指定一个滑动过期时间就可以实现了。

以上二个选项分别对应Add, Insert方法中的DateTime absoluteExpiration, TimeSpan slidingExpiration这二个参数。
注意:这二个参数都是成对使用的,但不能同时设置它们,最多只能一个参数值有效。也就是当设置absoluteExpiration时, slidingExpiration就必须设置为NoSlidingExpiration,  而当设置slidingExpiration时,absoluteExpiration必须设置为NoAbsoluteExpiration

缓存依赖项
缓存对象中的项可以与文件、缓存键、文件或缓存键的数组或另一个 CacheDependency 对象之间建立依附性关系。 CacheDependency 类监视依附性关系,以便在任何这些对象更改时,自动移除该缓存项。



参考资料
http://www.cnblogs.com/fish-li/archive/2011/12/27/2304063.html

以上是关于Asp.net中的Cache--HttpRuntim.Cache 和 HttpContext.Current.Cache的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET 5/ASP.NET Core 1 中的关注点分离和 n 层架构

ASP.NET MVC 中的 ASP.NET AJAX 与 jQuery

有没有办法让 Asp.net 零公共站点(Asp.net MVC)中的实时登录用户?

更改 ASP.NET SPA 模板中的 ASP.NET 标识代码的原因?

ASP.NET Web API 与 ASP.NET Core 中的 URL 匹配差异

如何仅为 ASP.NET 5 (ASP.NET Core) 中的受保护操作添加令牌验证