.net 方法内容缓存简化

调用:

      public string GetNodeName(string nodeNum)
        {
            Func<string> func = () =>
            {
                return db.FirstOrDefault<string>("SELECT PNodeName FROM  " + NodeNumTableName + " WHERE PNodeNum=@0 AND AppKey=@1", nodeNum, PublicVars.AppKey);
            };
            return CacheHelper.Set<string>(  func, 1200, nodeNum);

        }

缓存帮助类:

/// <summary>
    /// 缓存帮助类
    /// </summary>
    public static class CacheHelper
    {
        /// <summary>
        /// 获取
        /// </summary>
        /// <param name="name">key</param>
        /// <returns></returns>
        public static object Get(string name)
        {
            return HttpRuntime.Cache.Get(name);
        }

        /// <summary>
        /// 获取
        /// </summary>
        /// <param name="method">缓存方法</param>
        /// <param name="methodParams">方法参数(保证唯一性)</param>
        /// <returns></returns>
        public static object Get(MethodBase method, params object[] methodParams)
        {
            return HttpRuntime.Cache.Get(GetMethodCacheName(method, methodParams));
        }

        /// <summary>
        /// 移除
        /// </summary>
        /// <param name="name">key</param>
        public static void Remove(string name)
        {
            HttpRuntime.Cache.Remove(name);
        }

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

        /// <summary>
        /// 写入 
        /// </summary>
        /// <param name="name">key</param>
        /// <param name="value">value</param> 
        /// <param name="cacheDependency">依赖项</param>
        /// <param name="timeOut">过期时间(秒)</param>
        public static void Set(string name, object value, CacheDependency cacheDependency = null, int timeOut = 20 * 60)
        {
            if (value == null)//缓存空对象要报错
            {
                return;
            }
            if (cacheDependency == null)
            {
                HttpRuntime.Cache.Insert(name, value, null, DateTime.Now.AddSeconds(timeOut), TimeSpan.Zero);
            }
            else
            {
                HttpRuntime.Cache.Insert(name, value, cacheDependency, Cache.NoAbsoluteExpiration, TimeSpan.FromSeconds(timeOut));
            }
        }

        /// <summary>
        /// 写入
        /// </summary>
        /// <typeparam name="T">返回类型</typeparam> 
        /// <param name="func">数据方法</param>
        /// <param name="timeOut">缓存时间(秒)</param>
        /// <param name="methodParams">方法参数(保证唯一性)</param>
        /// <returns>缓存数据</returns>
        public static T Set<T>(Func<T> func, int timeOut = 20 * 60, params object[] methodParams) where T : class
        {
            /*
             * 注意事项:
             * 1.本方法请勿滥用,太多的缓存也会降低性能
             * 2.调用本方法一定要避免返回脏数据问题,请合理利用methodParams参数
             * 3.缓存时间要控制在合理的时间段内,如果时间很短一定要考虑一个问题:缓存数据的利用率怎么样,是否真的需要缓存
             * 4.返回后不能操作对象,否则可能出现缓存数据为操作后的对象问题
             */
            if (timeOut < 1)
            {
                return func();
            }
            string cacheKey = GetMethodCacheName(func.Method, methodParams);
            T cacheData = CacheHelper.Get(cacheKey) as T;
            if (cacheData == null)
            {
                cacheData = func();
                CacheHelper.Set(cacheKey, cacheData, null, timeOut);
            }
            return cacheData;
        }

        /// <summary>
        /// 获取换成方法缓存名称
        /// </summary>
        /// <param name="method">缓存方法</param>
        /// <param name="methodParams">方法参数(保证唯一性)</param>
        /// <returns></returns>
        public static string GetMethodCacheName(MethodBase method, object[] methodParams)
        {
            string cacheKey = $"CH_{method.DeclaringType.FullName}_{method.Name}";
            if (methodParams != null && methodParams.Length > 0)
            {
                cacheKey += "_" + MD5Helper.MD5Encrypt32(SerializeHelper.ToJson(methodParams));
            }
            return cacheKey;
        }
    }

  

其他方法:AOP

posted @ 2022-12-16 11:38  兴趣就是天赋  阅读(5)  评论(0编辑  收藏  举报