2

在我的简单 MVC3 应用程序中,用户可以对我的数据执行搜索,这些数据保存在 RavenHQ 的 RavenDB 数据库中。我知道 RavenDB 会主动缓存,但我想首先通过缓存搜索来避免对 RavenHQ 的 http 调用。每个用户可能会多次执行相同的搜索,并且不同的用户也可能会执行相同的搜索。数据不会比每周更频繁地更改。

搜索参数是搜索对象的属性。我尝试在操作(如下)上使用输出缓存但没有成功,这在搜索对象上有所不同。可能我需要单独更改搜索对象的每个属性,但这似乎不令人满意,因为我将来可能会添加更多属性。

你会如何处理这个问题?

  1. 动作的输出缓存因 search.AccName 等而异。
  2. Web 应用程序中没有缓存,依赖 RavenDB 缓存。
  3. 使用 HttpRuntime.Cache (但如果是,如何)?
  4. 其他一些策略。

原谅代码格式,有一些问题。

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
    });
}
4

2 回答 2

0

RavenDB 对此具有内置支持,请参阅: http ://ayende.com/blog/25601/ravenb-aggressive-caching-mode

于 2012-07-14T07:55:14.623 回答
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 应该告诉它根据搜索视图模型参数中的属性单独缓存。

于 2012-07-13T14:21:33.467 回答