缓存似乎真的很慢

本文关键字:真的 缓存 | 更新日期: 2023-09-27 18:27:35

我有一段缓存代码

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

缓存似乎真的很慢

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

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

我使用上面的方法加载了一个缓存的消息集合,还使用了类似的方法从数据库中提取其他实体。其中一个项目是"设置"对象。

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

var settings = Cache.GetSettings();

并提到,相反,加载时间显著下降。在这条线上有一个0.5秒的负载,然后每次对设置的引用都不需要任何时间。

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