假设我们正在建立一个电子商务网站,消费者可以通过输入关键词来搜索产品。再说还有为200,000产品,并且仍有成千上万的消费者使用该系统。比方说,在产品表相当频繁更新。由于产品数量并不高,我们大概可以存储整个产品表中存储和搜索反对它,而不是命中数据库。我们希望创建一个存储相同的数据,但驻留在不同的服务器(高可用性和性能的原因),分布式缓存,我们需要能够将这些高速缓存之间的数据同步,并在产品表被修改无效缓存。

我们的应用程序使用ASP.NET MVC和NHibernate建成。我想了解NHibernate的二级缓存是否会与我的情况有所帮助。我真的很感激,如果你们可以在此提供一些线索。

据我所知,2级高速缓存将有助于缓存查询结果,所以如果两个不同的用户使用相同的关键字搜索,L2高速缓存会从缓存中,而不是从数据库服务的结果。但它并不能帮助我们很多,因为产品表经常更新和高速缓存的结果将会过时。 我的问题是我在正确认识L2缓存,同时也存在任何帮助管理缓存我想这样做的方式(多个缓存,同样的数据,缓存之间的同步和缓存无效)。任何想法是高度赞赏。

有帮助吗?

解决方案

有同时使用的二级缓存(使用memcached的提供商)和NHibernate.Search附加在我看来,你可以从双方都有利。

在NHibernate.Search组件依赖于Lucene.Net和关键字搜索被从数据库它自分离。不同的索引文件为每个类创建映射和优化可以在字段级别使用属性进行设置,让您粒度的额外的水平。此外,可以实现最佳匹配和主张(检查Lucene的行动和/或动作Hibernate Search的)。作为一个说明,你不必维护索引(除非您明确请求索引重建);实施管理幕后的一切但如果你愿意的话,你可以操纵指数。所以,添加/删除/更新的产物将自动更新,根据索引。

对于二级缓存,你得到即时的性能提升。在测试环境中具有约2密耳的行的数据集我有超过20%的改善,甚至在非常低的请求计数。性能提升是作为请求数的增加而逐渐变大 - 应用程序第一次打2级高速缓存,如果没有找到它,然后点击数据库来获取所需的行,将它们插入的缓存为将来的查询。同样,你可以管理的东西像缓存持续时间和其他配置设置,以及明确清晰的缓存(这一切,它的一部分,或特定的条目),如果你想这样做。注意,高速缓存状态由应用程序保存期间管理/更新/删除。

有关scallability * 2级高速缓存依赖于供应商(即memcached是具有高性能和可扩展性,并支持分布式实例)。 *为Lucene.Net/NHibernate.Search您将需要设置该指标将驻留和地方必须为所有网络应用程序实例读/写访问的具体地点。在此,敏感的链接是I / O和文件争,因此,在设置一台具有比光文件系统将防止这种情况发生更快(我代表你的情况有许多每秒数千次的搜索请求)

作为一个方面说明我会强烈建议NHibernate.Search,因为它比之类的查询非常快速,是很容易,执行应用程序中的SQL-Server的全文搜索(我做了)来使用。

其他提示

无论是二级高速缓存将有助于取决于你的产品表究竟是如何频繁相对于高速缓存命中更新。如果添加一个小时100种新产品而获得10000个查询一个小时,甚至10%的高速缓存命中率将有很大的不同。如果速率被颠倒,第二级高速缓存将是几乎没有价值的。

我建议你设置了一个压力测试环境,非常接近您的生产环境和各种二级缓存提供商进行基准测试。

另外,请检查你的数据库是用于更新重的情况正确配置。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top