.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

浙公网安备 33010602011771号