我有这段缓存代码
public static ICollection<Messages> GetMessages()
{
if (System.Web.HttpContext.Current.Cache["GetMessages_" + user_id] == null)
{
using (DataContext db = new DataContext())
{
var msgs = (from m in db.Messages
where m.user_id == user_id
&& m.date_deleted == null
select m).ToList();
System.Web.HttpContext.Current.Cache.Insert(
"GetMessages_" + user_id, msgs, null,
DateTime.Now.AddMinutes(5), TimeSpan.Zero);
}
}
return System.Web.HttpContext.Current.Cache["GetMessages_" + user_id]
as ICollection<Messages>;
}
第一次运行时,它从SQL表中提取数据,大约需要1500毫秒。每次后续通话大约需要600毫秒。我正在测试的集合目前只包含3个对象,每个对象都有最少的数据(一个字符串,3个日期时间字段,3个bool和5个int)
这是正常的吗?每次加载一个包含这么少量数据的页面大约需要2秒钟。
[仅供参考,这只是在开发机器上运行,而不是完全成熟的Web服务器。数据是从远程服务器提取的,但这应该只影响初始页面加载]
答案 0 :(得分:0)
请记住,当您在EF代码中创建第一个上下文第一个方法时 - EF必须从元数据重建模型,这会减慢第一次调用。
答案 1 :(得分:0)
正如HackedByChinese所说,这是在VS开发网络服务器上运行的,这当然会减慢速度。但是,我确实发现我的编程风格适用于非常慢的加载时间。
我使用上面的方法来加载缓存的消息集合,以及从数据库中撤回其他实体的类似方法。一个这样的项目是“设置”对象。
在设置页面上,每次我想要返回一个属性时,我都会调用该函数。例如Cache.GetSettings().username
,然后是Cache.GetSettings().useremail
等。我认为这会使应用程序运行得更快,因为它每次都从缓存中检索对象,而无需访问数据库。但显然,缓存并不像内存那么快。每次呼叫大约需要半秒钟(在本地服务器上),也可能是远程服务器上的.1s或.2s。我意识到我是否将其设置为变量......
var settings = Cache.GetSettings();
并引用相反,加载时间显着下降。此行有一个0.5秒的负载,然后每个后续的设置参考都没有时间。
总而言之,是的,缓存可能很慢,但只有你像我一样以愚蠢的方式使用它!