Asp.net mvc 3 我应该如何处理此MVC3/RavenDB应用程序的搜索结果缓存?

Asp.net mvc 3 我应该如何处理此MVC3/RavenDB应用程序的搜索结果缓存?,asp.net-mvc-3,caching,ravendb,Asp.net Mvc 3,Caching,Ravendb,在我的简单MVC3应用程序中,用户可以对我的数据执行搜索,这些数据保存在RavenHQ的RavenDB数据库中。我知道RavenDB会主动缓存,但我想通过缓存搜索来避免对RavenHQ的http调用。每个用户可能会多次执行相同的搜索,而且不同的用户也可能会执行相同的搜索。数据变化的频率不会超过每周 搜索参数是搜索对象的属性。我尝试在操作(如下)上使用输出缓存,但没有成功,在搜索对象上有所不同。可能我需要根据搜索对象的每个属性分别进行更改,但这似乎不令人满意,因为我可能在将来添加更多属性 你将如何

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

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

你将如何处理这个问题

  • 操作上的输出缓存因search.AccName等而异
  • web应用中没有缓存,依赖RavenDB缓存
  • 使用HttpRuntime.Cache(如果是,如何使用)
  • 其他一些策略
  • 请原谅,代码格式有问题

    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越看越好!