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