C# 高速缓存 Cache缓存, 防止多次读取数据库

在进行项目设计的时候会出现对重复 数据的重用 可能会用cookie 和 session, 但是对于安全性和性能方面都不是最实用的!

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)构造函数初始化缓存对象。

cache与session,cookie的区别:

session把数据保存在服务器端,每一个用户都有属于自己的Session,与别人的不冲突

就是说,你登陆系统后,你的信息(如账号、密码等)就会被保存在服务器上一个单独的session中,当你退出系统后服务器就会丢掉这个session,你的数据也就没了,必须再次登陆,如果登陆超时也会被丢掉,要看人家系统是怎么设置的了

Cookie同session一样是保存你个人信息的,不过是保存在客户端,也就是你使用的电脑上,并且不会被丢掉,除非你删除浏览器Cookie

Cache是保存系统上的信息的,因为从Cache中读数据比较快,有些系统(网站)会把一些经常被使用的数据放到Cache里,提高访问速度,优化系统性能

session和cookie是面向单个用户的,cache是面向的是所有用户。

End。。。

Cachehelper类

  1 using System;
  2 using System.Collections;
  3 using System.Collections.Generic;
  4 using System.Linq;
  5 using System.Text;
  6 using System.Threading.Tasks;
  7 using System.Web;
  8 using System.Web.Caching;
  9 
 10 namespace 后端操作cookie
 11 {
 12 class CacheHelper
 13 { /// <summary>
 14 /// 获取当前应用程序指定CacheKey的Cache值
 15 /// </summary>
 16 /// <param name="CacheKey">
 17 /// <returns></returns>y
 18 public static object GetCache(string CacheKey)
 19 {
 20 System.Web.Caching.Cache objCache = HttpRuntime.Cache;
 21 return objCache[CacheKey];
 22 }
 23 
 24 /// <summary>
 25 /// 设置当前应用程序指定CacheKey的Cache值
 26 /// </summary>
 27 /// <param name="CacheKey">
 28 /// <param name="objObject">
 29 public static void SetCache(string CacheKey, object objObject)
 30 {
 31 System.Web.Caching.Cache objCache = HttpRuntime.Cache;
 32 objCache.Insert(CacheKey, objObject);
 33 }
 34 
 35 
 36 /// <summary>
 37 /// 设置当前应用程序指定CacheKey的Cache值
 38 /// </summary>
 39 /// <param name="CacheKey">
 40 /// <param name="objObject">
 41 public static void SetCache(string CacheKey, object objObject, DateTime absoluteExpiration, TimeSpan slidingExpiration)
 42 {
 43 System.Web.Caching.Cache objCache = HttpRuntime.Cache;
 44 objCache.Insert(CacheKey, objObject, null, absoluteExpiration, slidingExpiration);
 45 }
 46 
 47 /// <summary> 
 48 /// 设置数据缓存 
 49 /// </summary> 
 50 public static void SetCache(string CacheKey, object objObject, int timeout = 7200)
 51 {
 52 try
 53 {
 54 if (objObject == null) return;
 55 var objCache = HttpRuntime.Cache;
 56 //相对过期 
 57 //objCache.Insert(cacheKey, objObject, null, DateTime.MaxValue, timeout, CacheItemPriority.NotRemovable, null); 
 58 //绝对过期时间 
 59 objCache.Insert(CacheKey, objObject, null, DateTime.Now.AddSeconds(timeout), TimeSpan.Zero, CacheItemPriority.High, null);
 60 }
 61 catch (Exception)
 62 {
 63 //throw; 
 64 }
 65 }
 66 /// <summary>
 67 /// 清除单一键缓存
 68 /// </summary>
 69 /// <param name="key">
 70 public static void RemoveKeyCache(string CacheKey)
 71 {
 72 try
 73 {
 74 System.Web.Caching.Cache objCache = HttpRuntime.Cache;
 75 objCache.Remove(CacheKey);
 76 }
 77 catch { }
 78 }
 79 
 80 /// <summary>
 81 /// 清除所有缓存
 82 /// </summary>
 83 public static void RemoveAllCache()
 84 {
 85 System.Web.Caching.Cache _cache = HttpRuntime.Cache;
 86 IDictionaryEnumerator CacheEnum = _cache.GetEnumerator();
 87 if (_cache.Count > 0)
 88 {
 89 ArrayList al = new ArrayList();
 90 while (CacheEnum.MoveNext())
 91 {
 92 al.Add(CacheEnum.Key);
 93 }
 94 foreach (string key in al)
 95 {
 96 _cache.Remove(key);
 97 }
 98 }
 99 }
100 /// <summary> 
101 /// 清除所有缓存
102 /// </summary> 
103 public static void RemoveAllCaches()
104 {
105 var cache = HttpRuntime.Cache;
106 var cacheEnum = cache.GetEnumerator();
107 while (cacheEnum.MoveNext())
108 {
109 cache.Remove(cacheEnum.Key.ToString());
110 }
111 }
112 /// <summary>
113 /// 以列表形式返回已存在的所有缓存 
114 /// </summary>
115 /// <returns></returns> 
116 public static ArrayList ShowAllCache()
117 {
118 ArrayList al = new ArrayList();
119 System.Web.Caching.Cache _cache = HttpRuntime.Cache;
120 if (_cache.Count > 0)
121 {
122 IDictionaryEnumerator CacheEnum = _cache.GetEnumerator();
123 while (CacheEnum.MoveNext())
124 {
125 al.Add(CacheEnum.Key);
126 }
127 }
128 return al;
129 }
130 
131 }
132 }