缓存看起来真的很慢

时间:2012-03-12 15:25:27

标签: c# asp.net-mvc linq caching razor

我有这段缓存代码

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服务器。数据是从远程服务器提取的,但这应该只影响初始页面加载]

2 个答案:

答案 0 :(得分:0)

请记住,当您在EF代码中创建第一个上下文第一个方法时 - EF必须从元数据重建模型,这会减慢第一次调用。

答案 1 :(得分:0)

正如HackedByChinese所说,这是在VS开发网络服务器上运行的,这当然会减慢速度。但是,我确实发现我的编程风格适用于非常慢的加载时间。

我使用上面的方法来加载缓存的消息集合,以及从数据库中撤回其他实体的类似方法。一个这样的项目是“设置”对象。

在设置页面上,每次我想要返回一个属性时,我都会调用该函数。例如Cache.GetSettings().username,然后是Cache.GetSettings().useremail等。我认为这会使应用程序运行得更快,因为它每次都从缓存中检索对象,而无需访问数据库。但显然,缓存并不像内存那么快。每次呼叫大约需要半秒钟(在本地服务器上),也可能是远程服务器上的.1s或.2s。我意识到我是否将其设置为变量......

var settings = Cache.GetSettings();

并引用相反,加载时间显着下降。此行有一个0.5秒的负载,然后每个后续的设置参考都没有时间。

总而言之,是的,缓存可能很慢,但只有你像我一样以愚蠢的方式使用它!