我正在编写一个在页面上显示项目列表的控件。该数据库包含(比方说)50,000 个与(比方说)1000 页相关(多对多)的项目。
我没有编写一个存储过程来从数据库中返回给定页面的一组完整项目(即所有列,以便水合项目对象列表),而是考虑执行以下操作来呈现列表:
- 在应用程序启动时,缓存所有列表项
- 让 SP 只返回项目的键值
- 遍历键列表并从缓存中检索匹配的对象
初步测试表明,这比为每个页面请求从数据库中提取列表执行得更快。它似乎也减少了整体内存消耗,因为每个页面请求只会查找现有对象,而不是每个请求都创建一个私有列表(当流量很高并且请求大页面时,内存消耗会变得非常高)。
所以现在我正在和其他开发者讨论如何实现缓存。我们提出了几种选择,在这里我希望您能提出意见:
- 使用 ASP.NET HttpContext.Current.Cache
- 使用静态/单例对象
在其中的每一个中,还可以选择是否:
- 单独缓存每个项目对象
- 构建一个包含所有项目对象的字典(或类似列表),然后缓存字典
读取性能是主要关注点。维护是次要的问题——我们会防御性地编写我们的 GetItems 方法来检查每个项目是否在缓存中,如果没有,则从数据库中检索它并将其插入缓存中。
我知道没有正确的答案……每件事都有利有弊。我只是想看看人们是否有可以分享上述任何一种方法的陷阱,或者是否有任何方法脱颖而出,成为迄今为止表现最好的方法,或者特别难以将新数据合并到其中。
谢谢