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

C# ASP.NET应用程序中搜索结果的缓存体系结构,c#,asp.net,caching,C#,Asp.net,Caching,在ASP.NET系统中缓存昂贵搜索结果的好设计是什么? 任何想法都会受到欢迎。。。特别是那些不需要发明我们自己的复杂基础设施的项目 以下是与此问题相关的一些一般要求: 每个搜索结果可以生成从零到数百条结果记录 每次搜索执行起来都比较昂贵和耗时(在数据库中为5-15秒) 结果在客户端显示之前必须分页,以避免用户信息过载 用户希望能够在返回的结果中进行排序、筛选和搜索 用户希望能够在搜索结果中快速切换页面 用户希望能够在任意数量的页面上选择多个项目(通过复选框) 一旦搜索完成,用户期望相对快速的性

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

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

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

  • 每个搜索结果可以生成从零到数百条结果记录
  • 每次搜索执行起来都比较昂贵和耗时(在数据库中为5-15秒)
  • 结果在客户端显示之前必须分页,以避免用户信息过载
  • 用户希望能够在返回的结果中进行排序、筛选和搜索
  • 用户希望能够在搜索结果中快速切换页面
  • 用户希望能够在任意数量的页面上选择多个项目(通过复选框)
  • 一旦搜索完成,用户期望相对快速的性能
我看到了在何处以及如何实现缓存的一些可能选项:

1。在服务器上缓存(在会话或应用程序缓存中),使用回发或Ajax面板来促进高效分页、排序、筛选和搜索。

  • 优点:ASP.NET基础架构提供了易于实施的良好支持
  • 缺点:服务器上非常健谈,内存密集,数据缓存的时间可能超过需要的时间;禁止负载平衡实践
2。在服务器上缓存(如上所述),但使用经过一段时间后移出内存的可序列化结构,以减少服务器上的内存压力

  • 优点:高效使用服务器内存;使用负载平衡进行扩展的能力
  • 缺点:来自.NET基础设施的有限支持;当数据结构发生变化时,潜在的脆弱性;对数据库施加额外的负载;要复杂得多
3。在客户端缓存(使用JSON或XML序列化),使用客户端Javascript对结果进行分页、排序、筛选和选择。

  • 优点:用户体验可接近“富客户端”水平;大多数浏览器都可以在本地处理JSON/XML—存在可供操作的像样库(例如jQuery)
  • 缺点:初始请求可能需要很长时间才能下载;在客户端机器上占用大量内存;在某种程度上需要手工制作的Javascript来实现
4。使用数据的压缩/编码表示在客户机上缓存-在切换页面、排序、筛选和搜索时回调服务器进行解码。

  • 优点:最小化对服务器的内存影响;允许状态在客户端需要时继续存在;与JSON/XML相比,客户端上的内存使用略有改善
  • 缺点:大型数据集在客户端/服务器之间来回移动;与使用JSON/XML的纯客户端缓存相比,性能较慢(由于网络I/O);实现起来要复杂得多-来自.NET/browser的支持有限
5。一些我没有考虑过的替代缓存方案…

对于#1,您是否考虑过使用状态服务器(甚至SQL server)或共享缓存机制?现在已经有很多,而且正在变得非常成熟——RTM可能很快就会出现。基于用户是否创建新搜索、是否点击除搜索分页之外的任何其他页面以及最后一个标准超时(20分钟)的缓存无效方案应该可以非常成功地将缓存降至最小大小

参考资料:


既然你说欢迎任何想法:

我们已经相当成功地使用企业库缓存来缓存来自LINQ结果的结果集

它支持自定义缓存过期,因此应该支持您的大部分需求(带有一点自定义代码)。如果搜索隐私很重要的话,它也有很多支持存储,包括加密的支持存储

它功能齐全

我的建议是将#1和#3结合起来:

  • 在服务器上缓存查询结果
  • 将结果作为完整页面和JSON视图提供
  • 缓存在客户端动态检索的每个页面,但每次页面更改时发送请求
  • 使用etag执行客户端缓存失效
  • 看看-它使1/2非常简单,在负载平衡系统中工作良好。免费、开源,我们已经使用它大约一年了,没有任何问题。

    在“替代”缓存方案下提出了一个想法。这并不能回答给定缓存体系结构的问题,而是返回到搜索应用程序的原始需求

    即使您实现了自己的缓存,它的效率也可能不是最优的——尤其是当您的搜索索引不断增大时。缓存命中率将随着索引的增长而降低。在某个拐点上,由于搜索和缓存都有专用的资源,您的搜索实际上可能会减慢

    大多数搜索子系统都实现了自己的内部缓存体系结构,以提高运行效率,一个开源的搜索系统建立在,维护自己的内部缓存,以提供快速的操作。还有其他适合您的搜索系统,它们采用与结果缓存类似的策略


    我建议您考虑一个单独的搜索体系结构,如果您的搜索索引允许,因为在自由文本关键字搜索中缓存是一个复杂的操作来有效地实现。

    < P>如果您能够等到2010年3月,NET 4附带一个新的,它承诺很多实现(磁盘,备忘录)。