ASP.NET HttpRuntime.Cache缓存类使用总结

Anonymity | | 访问(136)

  1.前言

  a.在Web开发中,我们经常能够使用到缓存对象(Cache),在ASP.NET中提供了两种缓存对象,HttpContext.Current.Cache和HttpRuntime.Cache,那么他们有什么区别呢?下面简单描述一下:

  (1):HttpContext.Current.Cache 为当前Http请求获取Cache对象,通俗来说就是由于此缓存封装在了HttpContenxt中,而HttpContext只局限于Web中,所以此缓存信息只能够在Web中使用。

  (2):HttpRuntime.Cache 获取当前应用程序的Cache,通俗来说就是此缓存信息虽然被放在了System.Web命名空间下,但是非Web程序也可以使用此缓存。

  上面两种类型作对比,我们就能够看出,一般情况下我们都建议使用HttpRuntime.Cache 。

  b.在缓存领域中,现在不止只有ASP.NET提供的缓存,还有Redis和Memcached等开源的Key_Value存储系统,也是基于内存去管理的,那么我们在这些文章中基本也都会有说到。

  c.那么这篇文章我们就简单的封装一下HttpRuntime.Cache类的公用类,提供给别人直接使用,如有错误或者问题,请留言,必在第一时间去处理。

  d.缓存详解:http://www.cnblogs.com/caoxch/archive/2006/11/20/566236.html

  e.GitHub地址:https://github.com/kencery/Common/tree/master/KenceryCommonMethod/%E7%BC%93%E5%AD%98

  2.为什么使用缓存

  a.那么说了这么多,最终要的一个问题是我们为什么要使用缓存呢?

  (1):降低延迟,使响应速度加快。

  (2):降低网络传输,使响应速度加快。

  ...........................

  简单总结就是一句话,使用缓存是为了使系统更加稳定和快速。

  b.上面我们知道了为什么使用缓存,那么在什么情况下我们能够使用缓存呢?

  (1):数据可能会被频繁的使用。

  (2):数据的访问不频繁,但是它的生命周期很长,这样的数据建议也缓存起来,比如:淘宝的商品明细。

  ......................

  c.当然一般系统中我们建议使用Memcached和Redis键值对来存储缓存信息。

  d.那么是不是我们在写程序的时候想写缓存就写缓存呢?当然不是,我们还要判断哪里该用,哪里不该用,比如:如果我们整页输出缓存的话,会影响我们数据的更新等等.......

  e.这篇博文我们整理了HttpRuntime Cache的共同类,将如何使用此类都已经在代码中展示出来,代码如下:

  3.代码展示

using System;
using System.Collections;
using System.Web;
using System.Web.Caching;

namespace KenceryCommonMethod
{
    // HttpRuntime Cache读取设置缓存信息封装
    // K encery///2015-8-11////// 使用描述:给缓存赋值使用HttpRuntimeCache.Set(key,value....)等参数(第三个参数可以传递文件的路径(HttpContext.Current.Server.MapPath()))
    // 读取缓存中的值使用JObject jObject=HttpRuntimeCache.Get(key) as JObject,读取到值之后就可以进行一系列判断
    public class HttpRuntimeCache
    {
        // 设置缓存时间,配置(从配置文件中读取)
        private const double Seconds = 30*24*60*60;

        // 缓存指定对象,设置缓存
        public static bool Set(string key, object value)
        {
            return Set(key, value, null, DateTime.Now.AddSeconds(Seconds), Cache.NoSlidingExpiration,
                CacheItemPriority.Default, null);
        }

        // 缓存指定对象,设置缓存
        public static bool Set(string key, object value, string path)
        {
            try
            {
                var cacheDependency = new CacheDependency(path);
                return Set(key, value, cacheDependency);
            }
            catch
            {
                return false;
            }
        }

        // 缓存指定对象,设置缓存
        public static bool Set(string key, object value, CacheDependency cacheDependency)
        {
            return Set(key, value, cacheDependency, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration,
                CacheItemPriority.Default, null);
        }

        // 缓存指定对象,设置缓存
        public static bool Set(string key, object value, double seconds, bool isAbsulute)
        {
            return Set(key, value, null, (isAbsulute ? DateTime.Now.AddSeconds(seconds) : Cache.NoAbsoluteExpiration),
                (isAbsulute ? Cache.NoSlidingExpiration : TimeSpan.FromSeconds(seconds)), CacheItemPriority.Default,
                null);
        }

        // 获取缓存对象
        public static object Get(string key)
        {
            return GetPrivate(key);
        }

        // 判断缓存中是否含有缓存该键
        public static bool Exists(string key)
        {
            return (GetPrivate(key) != null);
        }

        // 移除缓存对象
        public static bool Remove(string key)
        {
            if (string.IsNullOrEmpty(key))
            {
                return false;
            }
            HttpRuntime.Cache.Remove(key);
            return true;
        }

        // 移除所有缓存
        public static bool RemoveAll()
        {
            IDictionaryEnumerator iDictionaryEnumerator = HttpRuntime.Cache.GetEnumerator();
            while (iDictionaryEnumerator.MoveNext())
            {
                HttpRuntime.Cache.Remove(Convert.ToString(iDictionaryEnumerator.Key));
            }
            return true;
        }

        //------------------------提供给上面方法进行调用-----------------------------------
        // 设置缓存
        public static bool Set(string key, object value, CacheDependency cacheDependency, DateTime dateTime,
            TimeSpan timeSpan, CacheItemPriority cacheItemPriority, CacheItemRemovedCallback cacheItemRemovedCallback)
        {
            if (string.IsNullOrEmpty(key) || value == null)
            {
                return false;
            }
            HttpRuntime.Cache.Insert(key, value, cacheDependency, dateTime, timeSpan, cacheItemPriority,
                cacheItemRemovedCallback);
            return true;
        }

        // 获取缓存
        private static object GetPrivate(string key)
        {
            return string.IsNullOrEmpty(key) ? null : HttpRuntime.Cache.Get(key);
        }
    }
}

  文章来源:http://www.cnblogs.com/hanyinglong/p/Cache.html