Asp.net mvc 3 我应该如何处理此MVC3/RavenDB应用程序的搜索结果缓存?
在我的简单MVC3应用程序中,用户可以对我的数据执行搜索,这些数据保存在RavenHQ的RavenDB数据库中。我知道RavenDB会主动缓存,但我想通过缓存搜索来避免对RavenHQ的http调用。每个用户可能会多次执行相同的搜索,而且不同的用户也可能会执行相同的搜索。数据变化的频率不会超过每周 搜索参数是搜索对象的属性。我尝试在操作(如下)上使用输出缓存,但没有成功,在搜索对象上有所不同。可能我需要根据搜索对象的每个属性分别进行更改,但这似乎不令人满意,因为我可能在将来添加更多属性 你将如何处理这个问题Asp.net mvc 3 我应该如何处理此MVC3/RavenDB应用程序的搜索结果缓存?,asp.net-mvc-3,caching,ravendb,Asp.net Mvc 3,Caching,Ravendb,在我的简单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
});
}
公共类AccItemSearch
{
公共字符串位置{get;set;}
公共字符串AccName{get;set;}
公共int?MinPrice{get;set;}
公共int?MaxPrice{get;set;}
}
公共类AccItemSearchResults
{
公共IEnumerable AccItems{get;set;}
公共AccItemSearch{get;set;}
}
公共PartialViewResult住宿(AccItemSearch)
{
var acciitems=新列表();
使用(IDocumentSession session=mvcapapplication.Store.OpenSession())
{
//通过查询RavenDB数据库填写accItems集合
}
返回PartialView(新AccItemSearchResults
{
AccItems=AccItems.ToList(),搜索=Search
});
}
由于您正在异步执行此操作方法,我将尝试使用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
});
}
[OutputCache(VaryByParam=“*”,持续时间=1800)]
公共PartialViewResult住宿(AccItemSearch)
{
var acciitems=新列表();
使用(IDocumentSession session=mvcapapplication.Store.OpenSession())
{
//通过查询RavenDB数据库填写accItems集合
}
返回PartialView(新AccItemSearchResults
{
AccItems=AccItems.ToList(),搜索=Search
});
}
VaryByParam应该告诉它根据search viewmodel参数中的属性分别缓存。由于您是异步执行此操作方法,我将尝试使用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
});
}
[OutputCache(VaryByParam=“*”,持续时间=1800)]
公共PartialViewResult住宿(AccItemSearch)
{
var acciitems=新列表();
使用(IDocumentSession session=mvcapapplication.Store.OpenSession())
{
//通过查询RavenDB数据库填写accItems集合
}
返回PartialView(新AccItemSearchResults
{
AccItems=AccItems.ToList(),搜索=Search
});
}
VaryByParam应该告诉它根据search viewmodel参数中的属性分别进行缓存。RavenDB对此有内置支持,请参阅:
RavenDB对此有内置支持,请参阅:
此操作返回的是部分视图,但如何将其包含在页面中?您是使用js调用此异步,还是使用@Html.Action输出它?如果是后者,您可能需要研究donut hold缓存。否则,我将首先将OutputCacheAttribute应用于操作。通过执行
[OutputCache(VaryByParams=“*”)
我正在从客户端异步调用操作,您可以通过所有参数改变它。我尝试了OutputCache,但发现它总是返回相同的数据。所以它总是缓存并返回第一个调用,即使第二个和第三个调用在AccItemSearch实例中具有不同的属性值?您是否已将缓存属性上的VaryByParam
设置为“*”
?这是我得出的结论,但如果我是个混蛋,我会再试一次。因为这不是今天第一次发生:-)您在这个操作中返回了部分视图,但是它是如何包含在页面上的呢?您是使用js调用此异步,还是使用@Html.Action输出它?如果是后者,您可能需要研究donut hold缓存。否则,我将首先将OutputCacheAttribute应用于操作。通过执行[OutputCache(VaryByParams=“*”)
我正在从客户端异步调用操作,您可以通过所有参数改变它。我尝试了OutputCache,但发现它总是返回相同的数据。所以它总是缓存并返回第一个调用,即使第二个和第三个调用在AccItemSearch实例中具有不同的属性值?您是否已将缓存属性上的VaryByParam
设置为“*”
?这是我得出的结论,但如果我是个混蛋,我会再试一次。因为今天这已经不是第一次了:-)太棒了-我想这就是我在这件事上想要的。我假设RavenDB缓存将在db服务器而不是Web服务器上进行。RavenDB越看越好!太棒了-我想这就是我在这个案例中想要的。我假设RavenDB缓存将在db服务器而不是Web服务器上进行。RavenDB越看越好!