ASP.Net 缓存技术 笔记


      在频繁读取的应用上添加缓存,是一个不错的方法,今天特别总结了一下,像我一样初次应用缓存技术时容易遇到的问题以及解决方法。
      1,微软其实已经将缓存的方法封装好了,大家在using 中 添加
            using System.Web;
            using System.Web.Caching;
           就行了,注意,需要在工程中引用System.Web.ddl包。

     2. 添加静态缓存助手
         

 /// <summary>
    /// 缓存静态助手
    /// </summary>
    #region sealed class CacheHelper
    public sealed class CacheHelper
    {
        private static readonly bool cacheEnable = bool.Parse(ParameterFactory.CachingEnable);
        private static readonly int cacheTimeout = int.Parse(ParameterFactory.CachingTimes);

        /// <summary>
        /// 取对象从Cache
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public static object getObjectFromCache(string key)
        {
            if (!cacheEnable)
                return null;
            return HttpRuntime.Cache[key];
        }

        /// <summary>
        /// 存储对象到Cache
        /// </summary>
        /// <param name="key"></param>
        /// <param name="obj"></param>
        /// <param name="cache_unit">缓存时间单位(空为使用配置变量)
        ///     second minute hour day
        /// </param>
        /// <param name="cache_times">缓存时长(0为使用配置变量)</param>
        public static void saveObjectToCache(string key, object data, string cache_unit, int cache_times)
        {
            if (!cacheEnable)
                return;
            //使用参数还是配置
            string cacheUnit = ((cache_unit == string.Empty || cache_unit == null)
                ? ParameterFactory.CachingUnit.ToLower() : cache_unit);
            int cacheTimes = ((cache_times > 0) ? cache_times : cacheTimeout);

            DateTime absoluteExpiration = DateTime.Now;
            switch (cacheUnit)
            {
                case "second":
                    absoluteExpiration = DateTime.Now.AddSeconds(cacheTimes);
                    break;
                case "minute":
                    absoluteExpiration = DateTime.Now.AddMinutes(cacheTimes);
                    break;
                case "hour":
                    absoluteExpiration = DateTime.Now.AddHours(cacheTimes);
                    break;
                case "day":
                    absoluteExpiration = DateTime.Now.AddDays(cacheTimes);
                    break;
            }
            HttpRuntime.Cache.Add(key, data, null, absoluteExpiration,
                System.Web.Caching.Cache.NoSlidingExpiration, CacheItemPriority.High, null);
        }
    }
    #endregion


      3 写个应用实例吧

      

        /// <summary>
        /// 获取问卷
        /// </summary>
        #region List<QUESTIONNAIRE> Cache_GetQuestionnaire()
        public List<QUESTIONNAIRE> Cache_GetQuestionnaire(int id)
        {

          string cache_key = "Cache_GetQuestionnaire";
          string cache_unit = "minute";
          int cache_times = 30;


          object obj = CacheHelper.getObjectFromCache(cache_key);
          if (obj == null)
          {
                obj = (List<QUESTIONNAIRE>)DaoQUESTIONNAIRE.SearchByWhere("ID = " + id);
                List<QUESTION> quList = null;
                for (int i = 0; i < (obj as List<QUESTIONNAIRE>).Count; i++)
                {
                    quList = (List<QUESTION>)DaoQUESTION.SearchByWhereOrder("QUESTIONNAIREID=" + (obj as List<QUESTIONNAIRE>)[i].Id, "ORDERIDX", true);
                    for (int j = 0; j < quList.Count; j++)
                    {
                        quList[j].Options = (List<OPTIONS>)DaoOPTIONS.SearchByWhere("QUESTIONID=" + quList[j].Id);
                    }
                    (obj as List<QUESTIONNAIRE>)[i].Questions = quList;
                }

                CacheHelper.saveObjectToCache(cache_key, obj, cache_unit, cache_times);

          }
          if (obj != null)
              return (List<QUESTIONNAIRE>)obj;
          else
              return null;
         
     
        }
        #endregion

 

4 我用的Habinate 所以要在Bussines.xml中配置一下
      <object id="CacheProxy" type="PMG.data.Tool.CacheProxy,PMG.data" autowire="byName" />

5 调用这个缓存方法
          #region 获得问卷缓存
    /// <summary>
    /// 获得问卷
    /// </summary>
    private void GetQN_Cache(int id)
    {
            List<QUESTIONNAIRE> qnList = CacheProxy.Cache_GetQuestionnaire(id);
            if (qnList != null)
            {
                string Res = JavaScriptConvert.SerializeObject(qnList);
                OutputJSon(Res);
            }
    }
    #endregion

6 别忘了注入这个缓存对象

    private CacheProxy _CacheProxy;
    public CacheProxy CacheProxy
    {
       get { return _CacheProxy;}
       set { _CacheProxy = value; }
    }

posted on 2009-09-22 17:55  Cheney Hao  阅读(182)  评论(0编辑  收藏  举报

导航