2013-10-26 58 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