这是正确的缓存吗?

时间:2013-10-26 23:12:27

标签: c# asp.net caching

我尝试缓存我的用户列表,这样当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秒刷新一次 - 是否正确?

1 个答案:

答案 0 :(得分:2)

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

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

您始终可以使用具有的内置缓存机制ASP.NET。你可以阅读它here

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

使用滑动过期如果您在设置的到期时间之前检索到对象,则对象将保留在缓存中。例如,如果您设置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;
    }
}