C#缓存介绍 Caching通用帮助类代码整理 .net几种缓存概述

C#缓存介绍 Caching通用帮助类代码整理 .net几种缓存概述

Cache的概述及用法和帮助类:

Cache 即高速缓存.那么cache是怎么样提高系统性能与运行速度呢?是不是在任何情况下用cache都能提高性能?是不是cache用的越多就越好呢?
  Cache 是怎么样工作的?
  Cache 是分配在服务器上的一个公共的内存片。
  所谓公共指的cache只要一创建是任何一个客户端浏览器都可以通过后台代码访问到它,它面向的是所有用户,相对而言session也是服务器上的一 段内存,但他面向的是单个用户。它是服务器的一段内存块,也就是说每个cache一经创建就占用了服务器资源的。所以从这点来说我们就可以说:并不是 cache越多越好。  
  cache 是有时间限制的,超过了服务器设定的过期时间,它就会被服务器回收。
  cache 可以存放任何对象

Cache支持装箱/拆箱操作。如你可以把一个DataSet对象ds通过Cache.Insert(“dsCache”,ds)的方式存到Cache中,可以通过拆箱操作 DataSet ds = (DataSet)Cache[“dsCache”]来访问它。

Cache 一般用于数据较固定,用的较频繁的地方。

Cache是有时间限制的。超过了服务器设置的过期时间,就会被服务器回收。当cache被回收后对应的内存块就会被清空,再次通过cache[“cachekey”]访问对象时返回的就是null值。


web站点中缓存的重要性毋庸置疑。我想很多.net开发人员在开发web应用系统的时候优先考虑使用的缓存并不是第三方缓存解决方案(比如 分布式缓存memcached、redis等等),而应该是.net framework已经提供的多种缓存解决方案。下面谈谈对.net framework中缓存的认识。

1、System.Web.Caching.Cache

估计大部分做过asp.net开发的人都用过这个命名空间下的缓存,我们可以直接使用HttpContext.Current.Cache实例而不 用实例化。当然这个命名空间下的Cache类是允许您实例化的,需要定制自己的缓存系统的当然可以完全自己控制如何初始化这个类。我在园子里看到过有很多 文章介绍Cache的CRUD辅助类库大多数都是针对System.Web.Caching.Cache。

需要说明的是,我们还可以通过该命名空间下的HttpRuntime.Cache实现web、控制台、winform等不同表现形式下的缓存,而且 完全无需自己实例化。HttpRuntime.Cache是之前个人开发中使用比较多的一个类,现在比较偏爱.net framework4.0中的增强型的缓存类MemoryCache。

2、Output Cache

众所周知,输出缓存主要分页面输出缓存和页面部分缓存。说白了,就是缓存整个页面的html或者部分html,没什么值得讨论的。

3、System.Runtime.Caching

现在开发中使用最多的类MemoryCache出自这个命名空间,使用前需要引用using System.Runtime.Caching。MemoryCache继承自ObjectCache, IEnumerable, IDisposable,其中ObjectCache是个抽象类。用过MemoryCache的人都知道,这个MemoryCache有一个属性叫 Default,通常可以像下面这样使用:

private static ObjectCache memCache = MemoryCache.Default;
当然我们也完全可以通过public MemoryCache(string name, NameValueCollection config = null)构造函数初始化缓存对象。

接着我们可以在web.config文件中配置每个MemoryCache实例运行的内存使用配额方案和配额检查周期,下面示例参考MSDN:

<system.runtime.caching>
<memoryCache>
<namedCaches>
<add name=”Default” cacheMemoryLimitMegabytes=”10″ pollingInterval=”00:02:00″/>
</namedCaches>
</memoryCache>
</system.runtime.caching>

这些配置意义在于可以明确指定每个MemoryCache实例运行的内存使用配额方案和配额检查周期。比如我们可以通过配置来按需更改 MemoryCache.Default实例的内存配额(不知道缓存可用最大内存是多少,可能还是传说中的800M左右)。缓存过期策略与其它的缓存框架 大同小异,与System.Web.Caching.Cache的不同只是名称不叫CacheDependency,而叫ChangeMonitor,并且提供了基于文件和目录的缓存依赖策略。关于缓存过期策略也比较有探讨的必要,不过个人开发中比较偏重于数据缓存和替换,目前还没有接触和使用过比较完美的过期策略解决方案。


以下是帮助类:

using System;using System.Collections;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Caching;using System.Web.Hosting;namespace ECS.Utility{/// <summary>/// Caching 的摘要说明/// </summary>public class CacheHelper {/// <summary>/// 获取当前应用程序指定CacheKey的Cache值/// </summary>/// <param name="CacheKey">/// <returns></returns>ypublic static object GetCache(string CacheKey){System.Web.Caching.Cache objCache = HttpRuntime.Cache;return objCache[CacheKey];}/// <summary>/// 设置当前应用程序指定CacheKey的Cache值/// </summary>/// <param name="CacheKey">/// <param name="objObject">public static void SetCache(string CacheKey, object objObject){System.Web.Caching.Cache objCache = HttpRuntime.Cache;objCache.Insert(CacheKey, objObject);}/// <summary>/// 设置当前应用程序指定CacheKey的Cache值/// </summary>/// <param name="CacheKey">/// <param name="objObject">public static void SetCache(string CacheKey, object objObject, DateTime absoluteExpiration, TimeSpan slidingExpiration){System.Web.Caching.Cache objCache = HttpRuntime.Cache;objCache.Insert(CacheKey, objObject, null, absoluteExpiration, slidingExpiration);}      /// <summary>        /// 设置数据缓存        /// </summary>       public static void SetCache(string CacheKey, object objObject, int timeout = 7200)        {            try           {                if (objObject == null) return;                var objCache = HttpRuntime.Cache;               //相对过期               //objCache.Insert(cacheKey, objObject, null, DateTime.MaxValue, timeout, CacheItemPriority.NotRemovable, null);                //绝对过期时间               objCache.Insert(cacheKey, objObject, null, DateTime.Now.AddSeconds(timeout), TimeSpan.Zero, CacheItemPriority.High, null);            }            catch (Exception)            {              //throw;            }        } /// <summary>/// 清除单一键缓存/// </summary>/// <param name="key">public static void RemoveKeyCache(string CacheKey){try{System.Web.Caching.Cache objCache = HttpRuntime.Cache;objCache.Remove(CacheKey);}catch { }}/// <summary>/// 清除所有缓存/// </summary>public static void RemoveAllCache(){System.Web.Caching.Cache _cache = HttpRuntime.Cache;IDictionaryEnumerator CacheEnum = _cache.GetEnumerator();if (_cache.Count > 0){ArrayList al = new ArrayList();while (CacheEnum.MoveNext()){al.Add(CacheEnum.Key);}foreach (string key in al){_cache.Remove(key);}}}/// <summary>      /// 清除所有缓存    /// </summary>      public static void RemoveAllCache()      {          var cache = HttpRuntime.Cache;          var cacheEnum = cache.GetEnumerator();          while (cacheEnum.MoveNext())          {              cache.Remove(cacheEnum.Key.ToString());          }      } /// <summary>/// 以列表形式返回已存在的所有缓存 /// </summary>/// <returns></returns> public static ArrayList ShowAllCache(){ArrayList al = new ArrayList();System.Web.Caching.Cache _cache = HttpRuntime.Cache;if (_cache.Count > 0){IDictionaryEnumerator CacheEnum = _cache.GetEnumerator();while (CacheEnum.MoveNext()){al.Add(CacheEnum.Key);}}return al;}}}


C#缓存主要是为了提高数据的读取速度。因为服务器和应用客户端之间存在着流量的瓶颈,所以读取大容量数据时,使用缓存来直接为客户端服务,可以减少客户端与服务器端的数据交互,从而大大提高程序的性能。

cache与session,cookie的区别:

session把数据保存在服务器端,每一个用户都有属于自己的Session,与别人的不冲突就是说,你登陆系统后,你的信息(如账号、密码等)就会被保存在服务器上一个单独的session中,当你退出系统后服务器就会丢掉这个session,你的数据也就没了,必须再次登陆,如果登陆超时也会被丢掉,要看人家系统是怎么设置的了Cookie同session一样是保存你个人信息的,不过是保存在客户端,也就是你使用的电脑上,并且不会被丢掉,除非你删除浏览器CookieCache是保存系统上的信息的,因为从Cache中读数据比较快,有些系统(网站)会把一些经常被使用的数据放到Cache里,提高访问速度,优化系统性能 
session和cookie是面向单个用户的,cache是面向的是所有用户。
End。。。

推荐阅读