2010-02-23 63 views
1

我想執行1天的數據緩存。 在我的MVC模型中,我從數據庫中獲取數據並在View上使用它。 我想在緩存中添加數據,如果不在那裏。如果它已經在緩存中,然後直接從那裏得到結果。 在我的模型我有一個函數的結果()中,我已經使用高速緩存的如何在MVC中執行緩存

if (HttpContext.Current.Cache[ID] == null) 
{ 
    query = db.Employee.FirstOrDefault(x=>x.id.Equals(ID)); 
      HttpContext.Current.Cache.Insert 
      (ID, query, null,DateTime.Now.AddDays(1), 
       System.Web.Caching.Cache.NoSlidingExpiration); 
} else query = (Employee)HttpContext.Current.Cache[ID]; 

但這裏緩存僅適用於當前請求,並且再次將數據從數據庫retrived和後一個新的插在高速緩存中執行爲相同的數據。我想要緩存中的數據1天。 請爲我提供緩存數據的方式。

謝謝。

+0

By HttpContext.Current.Cache [「ID」]你的意思是HttpContext.Current.Cache [ID](第一行)?否則,這是您的代碼中的錯誤。 – 2010-02-23 10:27:00

+0

這意味着HttpContext.Current.Cache [編號] – 2010-02-23 12:27:18

回答

-1

如果可能的話 - cache ViewResults。更簡單,更好。

對於原始緩存,我使用這個和它的作品如預期(翻過多個請求)=>

public static class CacheManager 
    { 
     public static bool Exists 
      (string cacheKey, HttpContextBase context) 
     { 
      return context.Cache[cacheKey] != null; 
     } 

     public static object Get 
      (string cacheKey, HttpContextBase context) 
     { 
      return context.Cache[cacheKey]; 
     } 

     public static T Get<T> 
      (string cacheKey, HttpContextBase context) 
      where T : class 
     { 
      return context.Cache.Get(cacheKey) as T; 
     } 

     public static T Get<T> 
      (string cacheKey, HttpContextBase context, Func<T> getItemCallback) 
      where T : class 
     { 
      T item = Get<T>(cacheKey, context); 
      if (item == null) { 
       item = getItemCallback(); 
       //by default - caching for 1 day 
       if (item!=null) 
        context.Cache.Insert(cacheKey, item, null, 
         DateTime.Now.AddDays(1),TimeSpan.Zero); 
      } 

      return item; 
     } 

     public static void Save<T> 
      (string cacheKey, HttpContextBase context, T value) 
      where T : class 
     { 
      context.Cache.Insert(cacheKey, value); 
     } 
    } 

用法=>

public IList<Database> AllDatabases 
     { 
      get 
      { 
       return CacheManager.Get 
        (CacheKeys.AllDatabases, ControllerContext.HttpContext, 
        () => databaseRepository.GetAll()); 
      } 
     } 

只是 - 我相信,通過上下文基地不必要的複雜

1

你想緩存你的動作的整個輸出還是隻是你的數據庫查詢?

如果是這樣,用你的行動中的OutputCache屬性,像這樣:

[OutputCache(Duration = 86400, VaryByParam = "None")] 
public ActionResult Index() 
{ 
    var data = GetFromDatabase(); 
    return View(data); 
} 

86400意味着我們要緩存它24小時。

請注意,這會緩存整個視圖,因此您的所有用戶都會看到相同的視圖。如果您有任何用戶特定的內容,請發表評論,我會盡力爲您提供一個新的解決方案。

+0

我不想緩存操作的輸出,但只想緩存數據庫查詢結果。 – 2010-02-23 12:00:22