2013-10-26 86 views
1

我嘗試緩存我的用戶列表,以便當200個用戶在線時,每10秒不會有200個數據庫查詢。這是正確的緩存嗎?

我有這樣的代碼:

using System; 
using System.Collections.Generic;  
using System.Linq; 
using System.Text; 

namespace Business 
{ 
    public class UserList 
    { 
     private static object locker = new object(); 
     public static List<DAL.OnlineList> userList; 
     public static DateTime date; 
    } 
} 

-

public static string GetOnlineList(HttpContext con) 
    { 
     List<DAL.OnlineList> onlineList = new List<DAL.OnlineList>(); 
     if (Business.UserList.date == DateTime.MinValue || Business.UserList.date < DateTime.Now.AddSeconds(-30)) 
     { 
      Business.UserList.date = DateTime.Now; 
      onlineList = DAL.UserDAL.GetAllOnlineUser().OrderBy(x => x.Username).ToList(); 
      Business.UserList.userList = onlineList; 
     } 
     else 
     { 
      onlineList = Business.UserList.userList; 
     } 

     //Before 
     //List<DAL.OnlineList> onlineList = DAL.UserDAL.GetAllOnlineUser().OrderBy(x => x.Username).ToList(); 
    } 

方法GetOnlineList每10秒鐘從一個WebMethod/PageMethod的/ JavaScript的呼叫調用。 因此,它之前是:200用戶,每10秒= 200 x 10 x 6 = 12000 db-querys每分鐘。

然後我的代碼是正確的,第一個用戶將從數據庫中加載列表並存儲它 - 並且它將每隔30秒刷新一次 - 正確嗎?

回答

2

我認爲在您的代碼段的條件,需要調整

if (Business.UserList.date == DateTime.MinValue || 
    Business.UserList.date > DateTime.Now.AddSeconds(-30)) 

你總是可以使用內置的緩存機制ASP.NET有。你可以閱讀它here

基本上,您有兩個選項可以通過滑動過期和絕對過期來緩存對象。

With slide expiration如果您檢索到的對象早於您設置的過期時間範圍,對象仍保留在高速緩存中。例如,如果將時間間隔設置爲2分鐘,並且每隔1分鐘檢索一次對象,它將永遠保留在緩存中。

隨着絕對到期,對象停留在基於時間跨度的緩存中,而不管它已被檢索了多少次。

在您的示例中,您擁有絕對過期邏輯。這裏是一個如何使用它的例子:

public List<DAL.OnlineList> Users 
{ 
    get 
    { 
     List<DAL.OnlineList> users = null; 
     string CacheKey = "dal_users"; 

     users = HttpContext.Current.Cache[CacheKey]; 
     if ((users == null)) 
     { 
      users = DAL.UserDAL.GetAllOnlineUser() 
        .OrderBy(x => x.Username).ToList(); 
      HttpContext.Current.Cache.Add(CacheKey, users, Nothing, 
       DateTime.Now.AddSeconds(30), Caching.Cache.NoSlidingExpiration, 
       CacheItemPriority.Default, null); 
     } 

     return users; 
    } 
} 
+1

絕對到期+1。 if(Cache [「UserList」]!= null)// USE CACHE else // DATABASE CALL'或者,你可以在global.asax中放一個循環來每30秒更新一次緩存,那麼用戶永遠不必等待爲數據庫更新...它將始終是最新的,而不依賴於更新緩存的請求。 – Zerkey