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();
   }

每 10 秒从 WebMethod / pageMethod / JavaScript 调用调用 GetOnlineList 方法。所以之前是:200 个用户,每 10 秒 = 200 x 10 x 6 = 每分钟 12000 个数据库查询。

那么我的代码是对的,第一个用户将从数据库中加载列表并存储它——它会每 30 秒刷新一次——对吗?

4

1 回答 1

2

我认为您的代码片段中的条件需要调整

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

您始终可以使用 ASP.NET 的内置缓存机制。你可以在这里阅读。

基本上,您有两种选择来缓存具有滑动到期和绝对到期的对象。

通过滑动过期,如果您在设置的过期时间跨度之前检索对象,则它会保留在缓存中。例如,如果您将时间跨度设置为 2 分钟,并且每 1 分钟检索一次对象,它将永远保留在缓存中。

使用absolute expiration,无论检索多少次,对象都会根据时间跨度保留在缓存中。

在您的示例中,您具有绝对到期逻辑。下面是一个关于如何使用它的例子:

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;
    }
}
于 2013-10-27T00:18:04.700 回答