不使用數(shù)據(jù)庫緩存依賴項(xiàng)實(shí)現(xiàn)同樣的功能
先說下當(dāng)前項(xiàng)目的場景 后臺人員1天不定時的 添加新聞和視頻圖片10條左右 數(shù)量不多
不使用緩存 來回和數(shù)據(jù)庫打交道 非常耗時 造成效率低 尤其是在數(shù)據(jù)量非常龐大的情況下
可是加了緩存 加多少時間的緩存? 新聞要保證實(shí)時更新 一發(fā)布立刻顯示出來
微軟給出了解決方法 數(shù)據(jù)庫緩存依賴項(xiàng) 但是貌似只能用在SQL上 而且要配置些東西 還有 并不透明~ 一些東西看不到
http://msdn.microsoft.com/zh-cn/library/system.web.caching.sqlcachedependency%28VS.80%29.aspx
感興趣的朋友可以查下MSDN 這有個博客 也有介紹
http://www.rzrgm.cn/ltp/archive/2009/06/30/1514331.html
這里提供另一種方法
先說下大概思路 在所有查找操作時 都把結(jié)果插入 cache 在對數(shù)據(jù)庫有操作時(增刪改) 刪除cache
有了思路 開始解決問題 這里會遇到兩個問題
第一 : 所有查找時 cache建 怎么定義 保證不重復(fù)呢 第二:微軟沒有提供刪除所有cache的方法 只有cache["鍵值名"].Remove(); 而沒有removeall();
下面上代碼和解決辦法 以及思路
#region##根據(jù)條件得到新聞
/// <summary>
/// 根據(jù)條件得到新聞
/// </summary>
/// <param name="tableName"></param>
/// <param name="whereStr"></param>
/// <param name="topCount"></param>
/// <returns></returns>
public List<CmsDemoModels.NewsInfo> GetByCondition(string whereStr, string topCount)
{
string cacheKey = string.Format("{0}.{1}.{2}", GetType(), "GetByCondition",whereStr+topCount);
if (HttpRuntime.Cache[cacheKey] != null)
{
return HttpRuntime.Cache[cacheKey] as List<CmsDemoModels.NewsInfo>;
}
else
{
//從數(shù)據(jù)庫里查找并插入緩存
using (CmsDemoDAL.NewsInfoServcie ns = new NewsInfoServcie())
{
List<NewsInfo> newsList=ns.GetByCondition(whereStr, topCount);
HttpRuntime.Cache.Insert(cacheKey,newsList, null, DateTime.Now.AddDays(1), TimeSpan.Zero);
return newsList;
}
}
}
string cacheKey = string.Format("{0}.{1}.{2}", GetType(), "GetByCondition",whereStr+topCount);
我定義這緩存鍵值不重復(fù)的方法是 用當(dāng)前類+方法名+所有參數(shù)名的組合 來保證唯一性
這樣把所有查詢的方法 以及查詢結(jié)果都緩存起來了~上面的方法 是刪除所有緩存public static void ClearOutputCache()
{
//移除自定義緩存
foreach (var item in HttpRuntime.Cache.Cast<DictionaryEntry>().ToArray())
{
HttpRuntime.Cache.Remove((string)item.Key);
}
}
可是又有個問題 我們有視頻表 圖片表 新聞 等等 我現(xiàn)在更新個新聞 就要刪除所有的緩存 其實(shí)只用刪除所有新聞的緩存就行了
稍微改進(jìn)下 效率又大大的提高了#region 刪除緩存
/// <summary>
/// 根據(jù)名字開頭刪除緩存
/// </summary>
/// <param name="StartName">緩存名字開頭</param>
public void RemoveAllCache(string StartName)
{
//移除自定義應(yīng)用程序緩存
DictionaryEntry[] de = HttpRuntime.Cache.Cast<DictionaryEntry>().ToArray();
foreach (var item in de)
{
string cacheKey = item.Key.ToString();
if (cacheKey.StartsWith(StartName))
{
HttpRuntime.Cache.Remove((string)item.Key);
}
}
}
#endregion
當(dāng)我們數(shù)據(jù)庫有變化時 比如添加了個新聞 調(diào)用p.RemoveAllCache(GetType().ToString());#region##添加新聞
/// <summary>
/// 添加新聞
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
public int Add(CmsDemoModels.NewsInfo info)
{
using (CmsDemoDAL.NewsInfoServcie ns = new NewsInfoServcie())
{
info.ViewCount = 0;
info.State = 0;
info.SortIndex = GetMaxSort() + 1;
int i= ns.Add(info);
PubClass p = new PubClass();
p.RemoveAllCache(GetType().ToString());
return i;
}
}
#endregion
這樣就把所有以GetType().ToString() 開頭的刪除掉了~~ 實(shí)現(xiàn)新聞的刪除新聞的 視頻的刪除視頻的
PS: 這里新聞添加和 查找 都是在BLL層下的 NewInfoManager類下 所以他們的 GetType().ToString() 會一樣
大概思路就這樣
有什么問題 可以留言交流 歡迎討論~
浙公網(wǎng)安備 33010602011771號