自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

如何不使用數(shù)據(jù)庫緩存,還達到實時更新

運維 數(shù)據(jù)庫運維
不使用緩存,更新耗時,效率低,作者又不希望使用依賴項。那么如何能在不使用數(shù)據(jù)庫緩存依賴項,又能達到實時更新的效果呢?請看下文...

先說下當(dāng)前項目的場景:

后臺人員1天不定時的,添加新聞和視頻圖片10條左右,數(shù)量不多

不使用緩存,回和數(shù)據(jù)庫打交道,非常耗時,造成效率低,尤其是在數(shù)據(jù)量非常龐大的情況下

可是加了緩存,加多少時間的緩存?新聞要保證實時更新,一發(fā)布立刻顯示出來

微軟給出了解決方法,數(shù)據(jù)庫緩存依賴項,但是貌似只能用在SQL上,而且要配置些東西;

還有,并不透明~ 一些東西看不到

這里提供另一種方法:

先說下大概思路,在所有查找操作時,都把結(jié)果插入 cache 在對數(shù)據(jù)庫有操作時(增刪改) 刪除cache

有了思路,開始解決問題,這里會遇到兩個問題

*** : 所有查找時,cache建怎么定義,保證不重復(fù)呢

第二:微軟沒有提供刪除所有cache的方法,只有cache["鍵值名"].Remove(); 而沒有removeall();

下面上代碼和解決辦法 以及思路

  1. #region##根據(jù)條件得到新聞  
  2.      /// <summary>  
  3.      /// 根據(jù)條件得到新聞  
  4.      /// </summary>  
  5.      /// <param name="tableName"></param>  
  6.      /// <param name="whereStr"></param>  
  7.      /// <param name="topCount"></param>  
  8.      /// <returns></returns>  
  9.      public List<CmsDemoModels.NewsInfo> GetByCondition(string whereStr, string topCount)  
  10.      {  
  11.          string cacheKey = string.Format("{0}.{1}.{2}", GetType(), "GetByCondition",whereStr+topCount);  
  12.          if (HttpRuntime.Cache[cacheKey] != null)  
  13.          {  
  14.              return HttpRuntime.Cache[cacheKey] as List<CmsDemoModels.NewsInfo>;  
  15.          }  
  16.          else 
  17.          {  
  18.              //從數(shù)據(jù)庫里查找并插入緩存  
  19.              using (CmsDemoDAL.NewsInfoServcie ns = new NewsInfoServcie())  
  20.              {  
  21.                  List<NewsInfo> newsList=ns.GetByCondition(whereStr, topCount);  
  22.                  HttpRuntime.Cache.Insert(cacheKey,newsList, null, DateTime.Now.AddDays(1), TimeSpan.Zero);  
  23.                  return newsList;  
  24.              }  
  25.          }  
  26.      } 

看上面的代碼

  1. string cacheKey = string.Format("{0}.{1}.{2}", GetType(), "GetByCondition",whereStr+topCount); 

我定義這緩存鍵值不重復(fù)的方法是,用當(dāng)前類+方法名+所有參數(shù)名的組合,來保證***性這樣把所有查詢的方法 以及查詢結(jié)果都緩存起來了~

  1. public static void ClearOutputCache()  
  2.     {  
  3.         //移除自定義緩存  
  4.         foreach (var item in HttpRuntime.Cache.Cast<DictionaryEntry>().ToArray())  
  5.         {  
  6.             HttpRuntime.Cache.Remove((string)item.Key);  
  7.         }  
  8.    }  

上面的方法,是刪除所有緩存

可是又有個問題,我們有視頻表、圖片表、新聞等等,我現(xiàn)在更新個新聞,就要刪除所有的緩存,其實只用刪除所有新聞的緩存就行了

  1. #region 刪除緩存  
  2.  
  3.  /// <summary>  
  4.  /// 根據(jù)名字開頭刪除緩存  
  5.  /// </summary>  
  6.  /// <param name="StartName">緩存名字開頭</param>  
  7.  public void RemoveAllCache(string StartName)  
  8.  {  
  9.      //移除自定義應(yīng)用程序緩存  
  10.      DictionaryEntry[] de = HttpRuntime.Cache.Cast<DictionaryEntry>().ToArray();  
  11.      foreach (var item in de)  
  12.      {  
  13.          string cacheKey = item.Key.ToString();  
  14.          if (cacheKey.StartsWith(StartName))  
  15.          {  
  16.              HttpRuntime.Cache.Remove((string)item.Key);  
  17.          }  
  18.      }  
  19.  }  
  20.  
  21.  #endregion 

稍微改進下 效率又大大的提高了

當(dāng)我們數(shù)據(jù)庫有變化時,比如添加了個新聞?wù){(diào)用

  1. p.RemoveAllCache(GetType().ToString()); 
  1. #region##添加新聞  
  2.      /// <summary>  
  3.      /// 添加新聞  
  4.      /// </summary>  
  5.      /// <param name="info"></param>  
  6.      /// <returns></returns>  
  7.      public int Add(CmsDemoModels.NewsInfo info)  
  8.      {  
  9.  
  10.          using (CmsDemoDAL.NewsInfoServcie ns = new NewsInfoServcie())  
  11.          {  
  12.              info.ViewCount = 0;  
  13.              info.State = 0;  
  14.              info.SortIndex = GetMaxSort() + 1;  
  15.              int i= ns.Add(info);  
  16.              PubClass p = new PubClass();  
  17.              p.RemoveAllCache(GetType().ToString());  
  18.              return i;  
  19.          }  
  20.      }  
  21.      #endregion 

這樣就把所有以GetType().ToString() 開頭的刪除掉了~~ 實現(xiàn)新聞的刪除新聞的,視頻的刪除視頻的

PS: 這里新聞添加和查找都是在BLL層下的NewInfoManager類下,所以他們的 GetType().ToString() 會一樣大概思路就這樣

有什么問題,可以留言交流,歡迎討論~

原文鏈接:http://www.cnblogs.com/wlflovenet/archive/2011/06/30/Cache.html

【編輯推薦】

  1. 關(guān)于商城系統(tǒng)中商品類別的設(shè)計
  2. 關(guān)于商城系統(tǒng)中商品類別的設(shè)計(續(xù)篇)
  3. 數(shù)據(jù)庫是怎么進行壓縮的?
  4. 知道數(shù)據(jù)庫設(shè)計的三大范式嗎
  5. 數(shù)據(jù)庫應(yīng)用呈三大趨勢 DBA要如何應(yīng)對

 

責(zé)任編輯:艾婧 來源: wlf的博客
相關(guān)推薦

2014-12-22 09:48:58

DBCAOracle 11

2022-04-14 09:00:00

開發(fā)數(shù)據(jù)庫工具

2024-12-16 08:01:57

2021-02-05 14:40:56

overflow: h代碼前端

2010-05-13 11:45:56

MySQL數(shù)據(jù)庫

2021-03-19 07:40:22

緩存數(shù)據(jù)庫日志

2018-03-28 09:26:43

數(shù)據(jù)庫緩存層優(yōu)化

2010-06-10 10:50:17

MySQL數(shù)據(jù)庫

2011-03-02 13:54:39

MySQL數(shù)據(jù)庫

2021-01-13 05:23:27

緩存數(shù)據(jù)庫高并發(fā)

2017-05-25 08:52:08

SQL Server數(shù)據(jù)庫

2015-04-22 14:41:04

云遷移Redis緩存數(shù)據(jù)模型調(diào)整

2024-01-09 16:02:11

數(shù)據(jù)庫流服務(wù)大數(shù)據(jù)

2009-03-19 10:08:09

C#數(shù)據(jù)庫查詢

2019-07-11 08:45:00

MySQL數(shù)據(jù)庫緩存

2019-10-08 15:54:42

SQL數(shù)據(jù)庫技術(shù)

2011-06-07 17:01:44

2021-08-02 10:53:28

PythonMySQL數(shù)據(jù)庫

2011-04-18 16:03:28

SSB數(shù)據(jù)庫

2023-12-28 10:58:45

點贊
收藏

51CTO技術(shù)棧公眾號