3

我正在编写一个在页面上显示项目列表的控件。该数据库包含(比方说)50,000 个与(比方说)1000 页相关(多对多)的项目。

我没有编写一个存储过程来从数据库中返回给定页面的一组完整项目(即所有列,以便水合项目对象列表),而是考虑执行以下操作来呈现列表:

  • 在应用程序启动时,缓存所有列表项
  • 让 SP 只返回项目的键值
  • 遍历键列表并从缓存中检索匹配的对象

初步测试表明,这比为每个页面请求从数据库中提取列表执行得更快。它似乎也减少了整体内存消耗,因为每个页面请求只会查找现有对象,而不是每个请求都创建一个私有列表(当流量很高并且请求大页面时,内存消耗会变得非常高)。

所以现在我正在和其他开发者讨论如何实现缓存。我们提出了几种选择,在这里我希望您能提出意见:

  • 使用 ASP.NET HttpContext.Current.Cache
  • 使用静态/单例对象

在其中的每一个中,还可以选择是否:

  1. 单独缓存每个项目对象
  2. 构建一个包含所有项目对象的字典(或类似列表),然后缓存字典

读取性能是主要关注点。维护是次要的问题——我们会防御性地编写我们的 GetItems 方法来检查每个项目是否在缓存中,如果没有,则从数据库中检索它并将其插入缓存中。

我知道没有正确的答案……每件事都有利有弊。我只是想看看人们是否有可以分享上述任何一种方法的陷阱,或者是否有任何方法脱颖而出,成为迄今为止表现最好的方法,或者特别难以将新数据合并到其中。

谢谢

4

1 回答 1

2

我会采用 Cache 的方法。一些原因是:

  1. 您可以控制在释放内存之前对象将在缓存中保留多长时间。在重负载下,这可以让服务器更好地响应。
  2. 如果值得付出努力,我什至可以更进一步并使用某种分布式缓存,以便它在应用程序池回收中幸存下来。我想到了MemcacheNCache 。

我不喜欢单例方法。在我看来,当您可以完美地使用 Cache 时,您将重新发明轮子。并发将与缓存一样成为一个问题,并且您失去了使用分布式缓存的灵活性。无论您采用哪种方法,我都会创建一个包装类来存储和检索 Cache 中的对象,这将使您将来可以轻松地从传统 Cache 无缝更改为分布式 Cache。

于 2012-05-01T14:52:12.433 回答