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) 编辑 收藏 举报