一、开篇
主要功能:改善程序性能。服务器的响应速度,尤其是当数据的处理过程变得复杂以及访问量变大时,变得比较明显。有些数据并非时刻在发生变化,如果我们可以将一些变化不频繁的数据的最终计算结果(包括页面输出)缓存起来, 就可以非常明显地提升程序的性能,缓存的最常见且最重要的用途就体现在这个方面。
二、Cache特点
Cache类有一个很难得的优点,用MSDN上的说话就是:此类型是线程安全的。
所以,这就意味着我们可以在任何地方读写Cache都不用担心Cache的数据在多线程环境下的数据同步问题。 多线程编程中,最复杂的问题就是数据的同步问题,而Cache已经为我们解决了这些问题。ASP.NET本身就是一个多线程的编程模型,所有的请求是由线程池的线程来处理的。 通常,我们在多线程环境中为了解决数据同步问题,一般是采用锁来保证数据同步, 自然地,ASP.NET也不例外,它为了解决数据的同步问题,内部也是采用了锁。
ASP.NET支持二种缓存项的过期策略:绝对过期和滑动过期。
1. 绝对过期,这个容易理解:就是在缓存放入Cache时,指定一个具体的时间。当时间到达指定的时间的时,缓存项自动从Cache中移除。
2. 滑动过期:某些缓存项,我们可能只希望在有用户在访问时,就尽量保留在缓存中,只有当一段时间内用户不再访问该缓存项时,才移除它, 这样可以优化内存的使用,因为这种策略可以保证缓存的内容都是【很热门】的。 操作系统的内存以及磁盘的缓存不都是这样设计的吗?而这一非常有用的特性,Cache也为我们准备好了,只要在将缓存项放入缓存时, 指定一个滑动过期时间就可以实现了。
三、帮助类
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Caching; namespace WebApplication6.Comment { public class CacheHelper { /// <summary> /// 读取缓存数据 /// </summary> /// <param name="cacheKey">键</param> /// <returns></returns> public static object GetCache(string cacheKey) { var objCache = HttpRuntime.Cache.Get(cacheKey); return objCache; } /// <summary> /// 设置缓存数据 /// </summary> /// <param name="cacheKey">键</param> /// <param name="content">值</param> public static void SetCache(string cacheKey, object content) { var objCache = HttpRuntime.Cache; objCache.Insert(cacheKey, content); } /// <summary> /// 设置缓存数据并且设置默认过期时间 /// </summary> /// <param name="cacheKey"></param> /// <param name="content"></param> /// <param name="timeOut"></param> public static void SetCache(string cacheKey, object content, int timeOut = 3600) { try { if (content == null) { return; } var objCache = HttpRuntime.Cache; //设置绝对过期时间 //绝对时间过期。DateTime.Now.AddSeconds(10)表示缓存在3600秒后过期,TimeSpan.Zero表示不使用平滑过期策略。 objCache.Insert(cacheKey, content, null, DateTime.Now.AddSeconds(timeOut), TimeSpan.Zero, CacheItemPriority.High, null); //相对过期 //DateTime.MaxValue表示不使用绝对时间过期策略,TimeSpan.FromSeconds(10)表示缓存连续10秒没有访问就过期。 //objCache.Insert(cacheKey, objObject, null, DateTime.MaxValue, timeout, CacheItemPriority.NotRemovable, null); } catch (Exception) { throw; } } /// <summary> /// 移除指定缓存 /// </summary> /// <param name="cacheKey">键</param> public static void RemoveAllCache(string cacheKey) { var objCache = HttpRuntime.Cache; objCache.Remove(cacheKey); } /// <summary> /// 删除全部缓存 /// </summary> public static void RemoveAllCache() { var objCache = HttpRuntime.Cache; var cacheEnum = objCache.GetEnumerator(); while (cacheEnum.MoveNext()) { objCache.Remove(cacheEnum.Key.ToString()); } } } }
借鉴:http://www.cnblogs.com/fish-li/archive/2011/12/27/2304063.html