在我的简单MVC3应用程序中,用户可以对我的数据执行搜索,该数据存放在RavenHQ的RavenDB数据库中。我知道RavenDB主动缓存,但我想首先通过缓存搜索来避免对RavenHQ的http调用。每个用户可能会多次执行相同的搜索,并且不同的用户也可能会执行相同的搜索。数据的变化不会超过每周。
搜索参数是搜索对象的属性。我在动作(下面)上使用输出缓存尝试没有成功,在搜索对象上有所不同。可能需要根据搜索对象的每个属性单独改变,但这似乎不能令人满意,因为我将来可能会添加更多属性。
你会怎么做?
借口代码格式化,遇到了一些问题。
public class AccItemSearch
{
public string Location { get; set; }
public string AccName { get; set; }
public int? MinPrice { get; set; }
public int? MaxPrice { get; set; }
}
public class AccItemSearchResults
{
public IEnumerable<AccItem> AccItems { get; set; }
public AccItemSearch Search { get; set; }
}
public PartialViewResult Accommodation(AccItemSearch search)
{
var accItems = new List<AccItem>();
using (IDocumentSession session = MvcApplication.Store.OpenSession())
{
// fill accItems collection by querying the RavenDB database
}
return PartialView(new AccItemSearchResults
{
AccItems = accItems.ToList(), Search = search
});
}
答案 0 :(得分:0)
由于您是异步执行此操作方法,我会尝试使用OutputCache属性:
[OutputCache(VaryByParam = "*", Duration = 1800)]
public PartialViewResult Accommodation(AccItemSearch search)
{
var accItems = new List<AccItem>();
using (IDocumentSession session = MvcApplication.Store.OpenSession())
{
// fill accItems collection by querying the RavenDB database
}
return PartialView(new AccItemSearchResults
{
AccItems = accItems.ToList(), Search = search
});
}
VaryByParam应该根据搜索viewmodel参数中的属性告诉它单独缓存。
答案 1 :(得分:0)
RavenDB内置了对它的支持,请参阅: http://ayende.com/blog/25601/ravendb-aggressive-caching-mode