在.net的web应用中,很多时候需要在当前应用程序下缓存一些数据比如验证码、登陆状态,我们可以自己创建一个静态类然后将数据放入其中来实现类似效果,但是使用应用程序的Cache更为方便,而且其性能好、能实现滑动过期之类的更加增加了它的实用性。
这里仅仅讨论它的概念和简单使用。
本文参考微软官方网站:System.Web.Caching.Cache
讨论对象
System.Web.Caching.Cache
命名空间: System.Web
程序集: System.Web(位于 System.Web.dll)
对象介绍
- 实现用于 Web 应用程序的缓存。无法继承此类。
- 对于每个应用程序域均创建该类的一个实例,并且只要对应的应用程序域保持活动,该实例便保持有效。
- 有关此类实例的信息通过 HttpContext 对象的 Cache 属性或 Page 对象的 Cache 属性来提供。
应用范围是web应用程序,并且每个程序下只会存在一个缓存实例。其内部是键值对组成的一个表,相当于一个缓存表的概念吧。
使用方式
直接实例化对象
使用非常简单,直接实例化一个cache对象就能使用cache对象的Insert、Remove等方法。
System.Web.Caching.Cache cache =new System.Web.Caching.Cache();
cache.Insert("key1","value1");
var value1 = cache.Get("key1");
程序已经自动帮我们实现了一个缓存表我们只需要直接往里面存取数据就行了,非常方便呢。
请注意,当前应用程序只会存在一个cache对象,不论你实例化几个cache对象都拥有相同的key和value、都指向当前应用缓存、指向当前缓存表。实际上缓存在你创建应用时已经被创建好了,你实例化cache对象只是调用了它一下,其实你根本不需要实例化,直接使用就行了。
HttpRuntime.Cache
用途:获取当前应用程序的 Cache。
命名空间:System.Web
程序集:System.Web(在 system.web.dll 中)
类型:System.Web.Caching.Cache
为了方便我们使用缓存时不用每次实例化,便有了HttpRuntime.Cache,我们在使用时可以直接通过如下方式来使用调用当前应用程序的cache:
HttpRuntime.Cache.Insert("key1","value1");
var value1 = HttpRuntime.Cache.Get("key1");
是不是很简单很方便。
请注意,虽然Cache写的是Web应用程序下使用,但是实际中可以通过HttpRuntime.Cache在控制台等其它应用程序下使用,因为HttpRuntime.Cache是应用程序级别的。
其它两种使用方式
这两种使用方式分别是:HttpContext.Current.Cache、HttpContext.Current.Cache
HttpContext.Current.Cache.Insert("key1", 1);
Page.Cache.Insert("key2", 2);
细心的你已经发现,在上面介绍Cache时有一句“有关此类实例的信息通过 HttpContext 对象的 Cache 属性或 Page 对象的 Cache 属性来提供”,便是这两种使用方式。那为什么还会有HttpRuntime.Cache的使用方式呢?
通过反编译(自己可以试试)我们可以发现Page.Cache其实return 的就是HttpRuntime.Cache,至于HttpContext.Current.Cache,可以查看HttpContext.Current的定义
其实HttpContext.Current.Cache就是Page.Cache,上下文都是同一个。
综上:HttpContext.Current.Cache和Page.Cache是对HttpRuntime.Cache的封装。级别不同而已,HttpRuntime.Cache应用程序级别,在大多数直接用HttpRuntime.Cache就够了。
总结
- 主要用于Web应用。(其它应用有其它应用的缓存类,但是也是可以通过HttpRuntime.Cache在其它应用使用)
- 每个应用只有一个缓存实例,使用的时候没必要实例化,直接调用
- 有三种方式来调用缓存实例,大多数情况下直接使用HttpRuntime.Cache