【问题标题】:Cache results from sql database, or query each time?从sql数据库缓存结果,还是每次查询?
【发布时间】:2011-10-17 12:29:22
【问题描述】:

我正在生成基于 sql 查询的页面。

这是查询:

CREATEPROCEDURE sp_searchUsersByFirstLetter 
    @searchQuery nvarchar(1)
AS
BEGIN
    SET NOCOUNT ON;

    SELECT UserName
    FROM Users Join aspnet_Users asp on Users.UserId = asp.UserId
    WHERE (LoweredUserName like @searchQuery + '%')

我可以为字母表中的每个字母调用此过程,并获取以该字母开头的所有用户。然后,我将这些用户放入我的一个页面上的列表中。

我的问题是:将用户列表缓存到我的网络服务器而不是每次都查询数据库会更好吗?像这样:

HttpRuntime.Cache.Insert("users", listOfUsersReturnedFromQuery, null, DateTime.Now.AddHours(1), System.Web.Caching.Cache.NoSlidingExpiration);

如果用户列表过时一小时,我可以。这会比每次查询数据库更有效吗?

【问题讨论】:

    标签: asp.net sql-server


    【解决方案1】:

    最好在查询满足以下约束的情况下使用缓存:

    • 数据不是时间关键的,即确保缓存命中不会导致您的代码错过最近的数据更新而破坏您的应用程序。
    • 数据未排序,即 A、B、C、D、E 被缓存,F 被另一个用户插入,您的用户插入 G 并命中缓存,导致 ABCDEG 而不是 ABCDEFG。
    • 数据变化不大。
    • 数据经常被查询和重复使用。

    大小并不是一个真正的因素,除非它真的会对你的 RAM 造成负担。

    我发现最好的缓存表之一是设置表,其中的数据实际上是静态的,几乎在每次页面请求时都会被查询,并且不必立即更改。

    最好的办法是测试哪些查询执行得最多,然后选择那些对数据库服务器征税最高的查询。其中,缓存任何你能负担得起的东西。您还应该查看调整最大缓存对象年龄。如果您每秒执行 100 次查询,则只需将其缓存 1 秒即可将该速率降低 99%,这在大多数实际情况下消除了更新延迟问题。

    【讨论】:

      【解决方案2】:

      如果您的服务器很少,内存兑现就不太好,因为它会在每台服务器和每台服务器的每个 w3p 进程中占用内存。

      保持一致的数据也很困难。

      我建议选择:

      • 基本输出缓存(假设您使用的是 MVC,这是零努力和良好的改进)
      • 使用较小的预先计算表的 Db 缓存,您可以在其中从输入字符串映射到 10 个可能的结果

      【讨论】:

        【解决方案3】:

        这真的取决于。您的数据库服务器是否存在瓶颈(我希望答案是否定的)?如果您访问数据库 26 次,与通常发生的情况相比,这算不了什么。如果您要访问数据库数十万次,您应该考虑在数据集或其他离线模型中缓存数据。

        所以我会说,。往返数据库应该没问题。

        但是测试没有替代品。这肯定会告诉你。

        【讨论】:

          【解决方案4】:

          考虑到每个数据库调用在网络和数据库负载方面总是很昂贵,我宁愿避免这种额外的操作和缓存项目,即使它们每小时被请求几次。

          我看到的只是一种相反的情况 - 当内存消耗方面的用户数量达到数兆字节时。

          【讨论】:

            【解决方案5】:

            缓存数据并返回是最快的,但这也取决于数据大小...如果数据量很大,则会导致性能问题。

            所以这几乎取决于您的要求。

            我希望您建议使用分页或混合模式,将一半的用户加载到缓存中,而不是在需要时加载其他数据......

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2010-11-26
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-03-24
              • 1970-01-01
              • 2012-11-27
              相关资源
              最近更新 更多