在ASP.NET系统中缓存昂贵搜索结果的好设计是什么?
任何想法都会受到欢迎......特别是那些不需要发明我们自己的复杂基础设施的想法。
以下是与此问题相关的一些一般要求:
我看到了一些可能的选项,用于实现缓存的位置和方式:
1。缓存在服务器上(在会话或应用缓存中),使用回发或Ajax面板来促进有效的分页,排序,过滤和搜索。
2。在服务器上缓存(如上所述)但使用可在一段时间后移出内存的可序列化结构以减少服务器上的内存压力
第3。在客户端上缓存(使用JSON或XML序列化),使用客户端Javascript对页面进行分页,排序,筛选和选择。
4。使用数据的压缩/编码表示在客户端上缓存 - 在切换页面,排序,过滤和搜索时回调到服务器进行解码。
5。我没有考虑过一些替代缓存方案......
答案 0 :(得分:12)
对于#1,您是否考虑过使用状态服务器(甚至SQL服务器)或共享缓存机制?来自plenty good的ones choose来自Velocity,而SharedCache (FOSS)正在变得非常成熟 - 很快就会推出RTM。基于用户是否创建新搜索,访问除搜索分页之外的任何其他页面以及最后标准超时(20分钟)的缓存失效方案应该非常成功地将缓存减少到最小尺寸。
参考文献:
答案 1 :(得分:5)
如果你能够等到2010年3月,.NET 4.0会附带一个新的System.Caching.CacheProvider,它承诺了很多实现(如上所述的磁盘,内存,SQL Server / Velocity)。
有一个很好的幻灯片技术here。然而,它有点“滚动你自己”或其中很多。但是,当框架发布时,可能会有许多为Provider模型编写的封闭式和开源式提供程序。
对于你所说的六点,会出现一些问题
您将使用多少内存将整个集存储在RAM中?或者至少拥有最受欢迎的10到100个搜索词的缓存。在第一次搜索之后,智能和缓存相关搜索可能是另一个想法。
5-15秒的结果是很长时间等待搜索所以我假设它类似于expedia.com搜索,其中查询多个源并返回大量信息。
从我有限的经验来看,客户端唯一缓存方法的最大问题是Internet Explorer 6 or 7。仅限服务器和HTML是我的首选,整个结果集在缓存中进行分页,在一段合理的时间段后到期。但是你可能已经尝试过了,看到服务器的内存被吃掉了。
答案 2 :(得分:3)
根据“替代”缓存方案提出一个想法。这不会回答您使用给定缓存架构的问题,而是回到您对搜索应用程序的原始要求。
即使/当您实现自己的缓存时,它的有效性也可能不是最佳的 - 尤其是当您的搜索索引的大小增加时。随着索引的增长,缓存命中率将降低。在某个拐点处,由于专用于搜索和缓存的资源,您的搜索实际上可能会变慢。
大多数搜索子系统都实现了自己的内部缓存架构,作为运营效率的一种手段。 Solr是一个基于Lucene构建的开源搜索系统,它维护自己的内部缓存以提供快速操作。还有其他适合您的搜索系统,它们采用类似的策略来进行结果缓存。
如果您的搜索索引保证,我建议您考虑使用单独的搜索体系结构,因为在自由文本关键字搜索基础上进行缓存是一项复杂的操作,无法有效实施。
答案 3 :(得分:1)
既然你说任何想法都是受欢迎的:
我们已经相当成功地使用企业库缓存来缓存LINQ结果中的结果集。
http://msdn.microsoft.com/en-us/library/cc467894.aspx
它支持自定义缓存过期,因此应该支持您的大部分需求(带一点自定义代码)。如果搜索隐私很重要,它还有很多后备存储,包括加密后备存储。
它功能齐全。
我的建议是#1和#3的组合:
答案 4 :(得分:0)
看一下SharedCache - 它使1/2变得非常容易,并且在负载均衡系统中工作正常。免费,开源,我们已经使用它大约一年没有问题。
答案 5 :(得分:0)
在考虑您的选择时,请考虑没有用户想要翻阅数据。我们强迫它们作为试图在HTML浏览器上构建应用程序的工件,这本身就不能很好地扩展。我们已经发明了各种各样的hackery来伪造应用程序状态,但它本质上是一个破碎的模型。
因此,请考虑将其实现为Silverlight或Flash中的实际富客户端。您将无法击败该用户体验,并且缓存比常规网页中实际大得多的数据非常简单。根据预期的用户行为,您的整体带宽可以进行优化,因为到服务器的往返只会获得一个紧凑的数据集,而不是任何ASP.NET开销。