用于在ASP.NET应用程序中搜索结果的缓存体系结构

LBu*_*kin 12 c# asp.net caching

在ASP.NET系统中缓存昂贵搜索结果的好设计是什么?

任何想法都会受到欢迎......特别是那些不需要发明我们自己的复杂基础设施的想法.

以下是与该问题相关的一些一般要求:

  • 每个搜索结果可以产生从零到几百个结果记录的包含
  • 每次搜索都相对昂贵并且耗费时间来执行(在数据库中5-15秒)
  • 结果必须在显示在客户端之前进行分页,以避免用户的信息过载
  • 用户希望能够在返回的结果中进行排序,过滤和搜索
  • 用户希望能够在搜索结果中的页面之间快速切换
  • 用户希望能够在任意数量的页面上选择多个项目(通过复选框)
  • 一旦搜索完成,用户期望相对快速的性能

我看到了一些可能的选项,用于实现缓存的位置和方式:

1.在服务器上缓存(在会话或应用缓存中),使用回发或Ajax面板来促进有效的分页,排序,过滤和搜索.

  • PROS:易于实现,来自ASP.NET基础架构的良好支持
  • 缺点:在服务器上非常繁琐,内存密集,数据可能会被缓存超过必要的时间; 禁止负载平衡实践

2.在服务器上缓存(如上所述),但使用一段时间后移出内存的可序列化结构,以减少服务器上的内存压力

  • PROS:有效使用服务器内存; 使用负载平衡扩展的能力;
  • 缺点:.NET基础架构的有限支持; 数据结构发生变化时可能会很脆弱; 在数据库上放置额外的负载; 显着更复杂

3.在客户端上缓存(使用JSON或XML序列化),使用客户端Javascript对页面进行分页,排序,筛选和选择.

  • PROS:用户体验可以接近"富客户"级别; 大多数浏览器本身可以处理JSON/XML - 存在用于操作的体面库(例如jQuery)
  • 缺点:初始请求可能需要很长时间才能下载; 客户机上占用大量内存; 将需要在某种程度上手工制作的Javascript来实现

4.使用数据的压缩/编码表示在客户端上缓存 - 在切换页面,排序,过滤和搜索时回调到服务器以进行解码.

  • PROS:最小化内存对服务器的影响; 只要客户需要,国家就可以生存; 通过JSON/XML略微改善了客户端上的内存使用率
  • 缺点:大型数据集在客户端/服务器之间来回移动; 与使用JSON/XML的纯客户端缓存相比,性能较慢(由于网络I/O); 实现起来要复杂得多 - 来自.NET /浏览器的有限支持

5.我没有考虑过一些替代缓存方案......

Rex*_*x M 13

对于#1,您是否考虑过使用状态服务器(甚至SQL服务器)或共享缓存机制?有很多的好的 那些以选择从,并且速度越来越非常成熟-不久可能会RTM.基于用户是否创建新搜索,访问除搜索分页之外的任何其他页面的缓存失效方案,最后标准超时(20分钟)应该非常成功地将缓存减少到最小尺寸.

参考文献:


Chr*_*s S 5

如果你能够等到2010年3月,.NET 4.0附带了一个新的System.Caching.CacheProvider,它承诺了许多实现(磁盘,内存,提到的SQL Server/Velocity).

有技术的一个很好的幻灯片在这里.然而,它有点"滚动你自己"或其中很多.但是,当框架发布时,可能会有许多为Provider模型编写的封闭式和开源式提供程序.

对于你提出的六点,会出现一些问题

  • 搜索结果中包含哪些内容?只是字符串数据或与每个结果相关的大量元数据?
  • 你正在搜索的集合有多大?

你将使用多少内存将整个存储器存储在RAM中?或者至少拥有最受欢迎的10到100个搜索词的缓存.在第一次搜索之后,智能和缓存相关搜索可能是另一个想法.

5-15秒的结果是等待搜索很长时间,所以我假设它类似于expedia.com搜索,其中查询多个源并返回大量信息.

从我有限的经验来看,客户端唯一缓存方法的最大问题是Internet Explorer 6或7.仅限服务器和HTML是我的首选,整个结果集在缓存中进行分页,在一段合理的时间段后到期.但是你可能已经尝试过了,看到服务器的内存被吃掉了.