Asp.net 查询数据库或缓存小结果集的性能更好?

Asp.net 查询数据库或缓存小结果集的性能更好?,asp.net,asp.net-mvc,Asp.net,Asp.net Mvc,假设我需要填充4或5个下拉列表,其中包含数据库中的项目。每个下拉列表将包含

假设我需要填充4或5个下拉列表,其中包含数据库中的项目。每个下拉列表将包含<15个项目。这些项目几乎从未改变

现在,我可以在每次访问页面时查询数据库,也可以从自定义类中获取值,该类将检查这些值是否已经存在于ASP.Net的缓存中,并且仅当它们不查询数据库以更新缓存时

这对我来说是微不足道的,但我不确定表演是否会更好。我认为会是(虽然不太可能是什么大问题)


你认为呢?

这就是类存在的目的。

这就是类存在的目的。

IO通常比内存操作更昂贵(数量级)。特别是如果您的数据库位于另一台计算机中,那么您甚至会使用网络资源,而且只使用缓存肯定会更快


但实际上,当您通过测量确定它是一个性能瓶颈时,最终需要进行优化。

IO通常比内存操作(按数量级)更昂贵。特别是如果您的数据库位于另一台计算机中,那么您甚至会使用网络资源,而且只使用缓存肯定会更快


但事实上,当您通过测量将其确定为性能瓶颈时,最终应进行优化。

在处理性能问题时,您应始终:

  • 先用最简单的方法做事(避免过早优化)
  • 使用设置性能目标来测试代码的性能(例如,在N个并发用户的负载下,200毫秒的响应时间)
  • 然后,如果您的代码没有执行,那么分析您的代码以确定什么是慢的,并分析您建议的性能修复以准确测量实际性能变化
  • 话虽如此,您的建议似乎是合理的(您通常希望内存缓存比数据库快),但这也取决于返回的数据、应用程序的内存负载、查询的成本、查询参数等


    您应该在更改前后对更改进行性能测试,以确定更改的实际影响(包括内存负载等),只有当您确定这些下拉列表是不可接受的性能问题的原因时,您才应该真正执行类似操作。

    在处理性能问题时,您应该始终:

  • 先用最简单的方法做事(避免过早优化)
  • 使用设置性能目标来测试代码的性能(例如,在N个并发用户的负载下,200毫秒的响应时间)
  • 然后,如果您的代码没有执行,那么分析您的代码以确定什么是慢的,并分析您建议的性能修复以准确测量实际性能变化
  • 话虽如此,您的建议似乎是合理的(您通常希望内存缓存比数据库快),但这也取决于返回的数据、应用程序的内存负载、查询的成本、查询参数等


    您应该在更改前后对更改进行性能测试,以确定更改的实际影响(包括内存负载等),只有当您确定这些下拉列表是导致不可接受的性能问题的原因时,才应该真正执行类似操作。

    快速回答您的问题:

  • 使用内置的.Net缓存。
  • 需要考虑的其他要点

  • 最好在单个数据库检索中检索所有主数据(考虑存储过程和数据集):不过,我不主张在所有场景中使用存储过程
  • 正如您正确地说的,确保您的数据访问层在往返数据库之前检查缓存
  • 此外,由于下拉列表的值不会经常更改;请记住保持较长的有效期
  • 最后,根据您的页面设计,您还可以查看片段缓存(部分页面缓存:用户控件),这会给您带来更大的好处,因为现在您既不访问数据缓存也不访问数据库 性能:
    同样,与获取主数据的直接往返相比,性能更多地取决于应用程序的负载。简单地说,正如Thomas建议的那样,使用cache类

    快速回答您的问题:

  • 使用内置的.Net缓存。
  • 需要考虑的其他要点

  • 最好在单个数据库检索中检索所有主数据(考虑存储过程和数据集):不过,我不主张在所有场景中使用存储过程
  • 正如您正确地说的,确保您的数据访问层在往返数据库之前检查缓存
  • 此外,由于下拉列表的值不会经常更改;请记住保持较长的有效期
  • 最后,根据您的页面设计,您还可以查看片段缓存(部分页面缓存:用户控件),这会给您带来更大的好处,因为现在您既不访问数据缓存也不访问数据库 性能:
    同样,与获取主数据的直接往返相比,性能更多地取决于应用程序的负载。简单地说,正如Thomas建议的那样,使用cache类

    同意。仅当数据库太慢且无法进一步加速时才进行缓存。同意。仅当数据库太慢且无法进一步加速时才缓存。