如何处理此MVC3 / RavenDB应用程序的搜索结果缓存?

时间:2012-07-13 13:59:57

标签: asp.net-mvc-3 caching ravendb

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

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

你会怎么做?

  1. 通过search.AccName等
  2. 改变操作的输出缓存
  3. 在网络应用中没有缓存,依赖于RavenDB缓存。
  4. 使用HttpRuntime.Cache(但如果是,如何)?
  5. 其他一些策略。
  6. 借口代码格式化,遇到了一些问题。

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

2 个答案:

答案 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