Asp.net mvc 高流量网站中的缓存问题

Asp.net mvc 高流量网站中的缓存问题,asp.net-mvc,performance,nhibernate,caching,second-level-cache,Asp.net Mvc,Performance,Nhibernate,Caching,Second Level Cache,假设我们正在建立一个电子商务网站,允许消费者通过键入关键字来搜索产品。假设最多有200000种产品,并且有数百万消费者使用该系统。假设产品表更新得相当频繁。因为产品的数量不是很高,我们可能可以将整个产品表存储在内存中,并对其进行搜索,而不是访问数据库。我们希望创建存储相同数据但驻留在不同服务器上的分布式缓存(出于高可用性和性能原因),并且我们需要能够在这些缓存之间同步数据,并在修改产品表时使缓存失效 我们的应用程序是使用ASP.NETMVC和NHibernate构建的。我试图了解NHiberna

假设我们正在建立一个电子商务网站,允许消费者通过键入关键字来搜索产品。假设最多有200000种产品,并且有数百万消费者使用该系统。假设产品表更新得相当频繁。因为产品的数量不是很高,我们可能可以将整个产品表存储在内存中,并对其进行搜索,而不是访问数据库。我们希望创建存储相同数据但驻留在不同服务器上的分布式缓存(出于高可用性和性能原因),并且我们需要能够在这些缓存之间同步数据,并在修改产品表时使缓存失效

我们的应用程序是使用ASP.NETMVC和NHibernate构建的。我试图了解NHibernate的2级缓存是否有助于解决我的问题。如果你们能解释一下,我会非常感激的

我知道二级缓存有助于缓存查询结果,因此,如果两个不同的用户使用相同的关键字进行搜索,二级缓存将从缓存而不是数据库提供结果。但这对我们没有多大帮助,因为产品表经常更新,缓存的结果会过时。
我的问题是,我是否正确理解二级缓存,是否存在任何有助于以我希望的方式管理缓存的东西(多个缓存、相同的数据、在缓存和无效缓存之间进行同步)。非常感谢您的任何想法。

二级缓存是否有用取决于您的产品表相对于缓存命中的更新频率。如果您每小时添加100个新产品,但收到10000个查询,那么即使缓存命中率为10%,也会产生很大的差异。如果速率颠倒,二级缓存几乎没有任何价值

我建议您设置一个与生产环境非常接近的压力测试环境,并对各种二级缓存提供程序执行基准测试

还要检查您的数据库是否已正确配置,以适应更新频繁的情况。

我建议使用w/Lucene。它与二级缓存一起工作。Lucene可以快速执行复杂的文本搜索,然后将实体键返回给NHibernate,NHibernate将完整实体从二级缓存中取出。搜索扩展负责保持Lucene索引的同步


做了最近一集关于你搜索产品描述的场景。这一集比较了NHibernate查询、SQL全文索引和Lucene w/NHibernate.Search。

使用了二级缓存(使用memcached提供程序)和NHibernate.Search附加组件,在我看来,您可以从中获益

搜索组件依赖于Lucene.Net,关键字搜索与数据库本身是解耦的。为每个映射的类创建不同的索引文件,可以使用属性在属性级别上设置优化,从而为您提供额外的粒度级别。此外,您还可以实现最佳匹配和建议(检查Lucene和/或Hibernate搜索)。请注意,您不必维护索引(除非您明确请求重新生成索引);该实现在后台管理所有内容,但如果您愿意,可以操纵索引。因此,添加/删除/更新产品将自动更新相应的索引

对于第二级缓存,您可以立即获得性能提升。在数据集约为2 mil行的测试环境中,即使在极低的请求计数下,我也有超过20%的改进。随着请求计数的增加,性能提升会逐渐增大—应用程序首先命中第二级缓存,如果找不到,则命中数据库以获取所需的行,并将它们插入缓存中以供将来查询。同样,您可以管理诸如缓存持续时间和其他配置设置之类的内容,如果愿意,还可以显式清除缓存(全部、部分或特定条目)。请注意,缓存状态由应用程序在保存/更新/删除期间管理

可伸缩性 *二级缓存取决于提供程序(即memcached具有高性能和可扩展性,并支持分布式实例)。 *对于Lucene.Net/NHibernate.Search,您需要设置索引将驻留的特定位置,并且该位置必须可供所有web应用程序实例进行读/写访问。请注意,这里的敏感链接是I/O和文件争用,因此设置具有超光速文件系统的计算机将防止这种情况的发生(我是针对每秒数千次搜索请求的场景说的)


作为补充说明,我强烈推荐NHibernate.Search,因为它比LIKE查询速度更快,而且比在应用程序内部实现SQL Server的全文搜索(我已经完成了)更易于使用。

全文索引是用于此类内容的。使用通配符“like”的SQL查询是错误的方法。感谢您提供的有用信息,Jaguar!我一直在研究NHibernate.Search和Lucene.NET,但除了Oren Eini的博客上的资源外,我找不到更多的资源。如果您知道任何其他有用的链接,如果您能将其传递给我,我将不胜感激。我想知道的另一个问题是,更新缓存或数据库时,Lucene.NET索引的文档如何与缓存或数据库同步?从你的帖子来看,二级缓存和NHibernate.Search/Lucene.NET似乎配合得很好?我已经阅读了Hibernate Search in action()的一部分,除了用法之外,配置差异基本相同。此外,我强烈建议Lucene in Action()更深入地了解Lucene是什么以及它是如何做到的。至于第二个问题,请记住缓存始终是db的表示形式。lucene索引是