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

2 篇文章 0 订阅

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>y
public 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一样是保存你个人信息的,不过是保存在客户端,也就是你使用的电脑上,并且不会被丢掉,除非你删除浏览器Cookie
Cache是保存系统上的信息的,因为从Cache中读数据比较快,有些系统(网站)会把一些经常被使用的数据放到Cache里,提高访问速度,优化系统性能 
session和cookie是面向单个用户的,cache是面向的是所有用户。
End。。。



  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#中,可以使用多种方式来实现缓存功能,下面简单介绍几种常见的方式: 1. 内存缓存 C# 内置了一个内存缓存 `MemoryCache`,可以用来存储和管理缓存数据。使用内存缓存需要引用 `System.Runtime.Caching` 命名空间,可以通过以下代码创建内存缓存对象: ``` MemoryCache cache = MemoryCache.Default; ``` 使用内存缓存可以轻松地缓存常用数据,如数据库查询结果、API调用结果等。 2. 分布式缓存 分布式缓存可以让多个应用程序共享同一个缓存,从而提高缓存的利用率。C#中常用的分布式缓存方案有 Redis 和 Memcached。 Redis 是一个开源的键值存储系统,支持多种数据结构,可以用来缓存数据、消息队列、分布式锁等。使用 Redis 需要引用 StackExchange.Redis 库,并配置 Redis 连接信息。 Memcached 是另一个开源的缓存系统,它也支持分布式缓存,使用起来比 Redis 更简单。可以通过引用 EnyimMemcached 库来使用 Memcached。 3. ASP.NET 缓存 ASP.NET 提供了一个缓存 `Cache`,可以用来缓存 ASP.NET 应用程序中的数据。使用 ASP.NET 缓存需要引用 System.Web 命名空间,可以通过以下代码获取缓存对象: ``` Cache cache = HttpRuntime.Cache; ``` 使用 ASP.NET 缓存可以缓存应用程序中的数据,如页面输出、用户信息等。 以上是C#中常用的三种缓存方式,具体使用哪种方式需要根据具体场景进行选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值