C# 在ASP.NET MVC 3中缓存数据

C# 在ASP.NET MVC 3中缓存数据,c#,asp.net-mvc-3,caching,C#,Asp.net Mvc 3,Caching,我有一个ASP.NET MVC 3应用程序,它基本上只是一组web服务。这些web服务由一组控制器操作公开。每个控制器操作都查询我的数据库。因为我的数据很少更改,而且不需要担心过时的数据,所以我想我应该实现一些缓存来提高性能。我的目标是: 从不缓存对用户的响应 将数据库记录缓存最多24小时。如果24小时过去了,请再次访问数据库 这有意义吗?我知道如何防止缓存响应。我只使用以下方法: HttpContext.Response.Cache.SetCacheability(cacheability)

我有一个ASP.NET MVC 3应用程序,它基本上只是一组web服务。这些web服务由一组控制器操作公开。每个控制器操作都查询我的数据库。因为我的数据很少更改,而且不需要担心过时的数据,所以我想我应该实现一些缓存来提高性能。我的目标是:

  • 从不缓存对用户的响应
  • 将数据库记录缓存最多24小时。如果24小时过去了,请再次访问数据库
  • 这有意义吗?我知道如何防止缓存响应。我只使用以下方法:

    HttpContext.Response.Cache.SetCacheability(cacheability)
    
    但是,我不确定如何将数据库记录缓存在内存中长达24小时。有人对此有什么建议吗?我甚至不知道去哪里找


    谢谢

    这是一篇很好的文章,讨论了ASP.NET MVC 3和缓存的几种与性能相关的实践。

    MVC框架与持久性无关。没有存储数据的内置方法,因此没有缓存存储数据的内置方法

    OutputCache
    属性可用于缓存服务器响应。但你明确表示那不是你想做的事

    但是,如果您想留在MVC框架内,您仍然可以使用内置的
    OutputCache
    。考虑将数据缓存为JSON结果

    [OutputCache(Duration = 86400)]
    public JsonResult GetMyData() {
        var results = QueryResults();
        return Json(results);
    }
    
    位于
    /ControllerName/GetMyData
    的JSON字符串将被缓存24小时,因此实际的查询每天只运行一次。这意味着您必须在最后一页上实现一个AJAX调用,或者从服务器上进行另一个HTTP调用。这两个都不理想


    我会在MVC框架之外寻找另一种解决方案。考虑一下,它是为这个目的而创建的。

    如果你使用MSSQL,你可能想看。
    我不确定您是否可以将缓存过期时间配置为24小时,但使用缓存依赖项,您可能不需要这样做-一旦数据库更新,它将使缓存失效(即,应该比时间过期策略更有效)。

    您所说的不完全是MVC的责任。ASP.Net只允许您计算它所产生的东西(很明显,这就是它们的响应)

    如果您想缓存数据,最好将其缓存到与生成数据相同的位置—BL或数据层中的某个位置

    你可以这样做:

    public class DataCacher
    {
        private static String data;
        private static DateTime updateTime;
    
        private DataCacher() { }
    
        public static String Data
        {
            get
            {
                if (data == null || updateTime > DateTime.Now)
                {
                    data = "Insert method that requests your data form DB here: GetData()";
                    updateTime = DateTime.Now.AddDays(1);
                }
                return data;
            }
        }
    }
    
    字符串数据
    在此处显示实际数据。添加此类后,将
    GetData()
    方法替换为
    DataCacher.Data


    希望它能帮助您,或者至少能引导您进一步思考。

    您可以使用
    System.Runtime.Caching
    命名空间(或者ASP.NET缓存,但它比较旧,只能在web应用程序中使用)

    下面是一个示例函数,您可以使用它来概括当前的数据检索机制。您可以更改MemoryCache.Add中的参数以控制其缓存量,但您要求24小时以上

    using System.Runtime.Caching;    // At top of file
    
    public IEnumerable<MyDataObject> GetData() 
    {
        IEnumerable<MyDataObject> data = MemoryCache.Default.Get(MYCACHEKEY) as IEnumerable<MyDataObject>;
        if (data == null)
        {
            data = // actually get your data from the database here
            MemoryCache.Default.Add(MYCACHEKEY, data, DateTimeOffset.Now.AddHours(24));
        }
        return data;
    }
    
    使用System.Runtime.Caching;//排在第一位
    公共IEnumerable GetData()
    {
    IEnumerable data=MemoryCache.Default.Get(MYCACHEKEY)作为IEnumerable;
    如果(数据==null)
    {
    data=//实际从这里的数据库获取数据
    MemoryCache.Default.Add(MYCACHEKEY,data,DateTimeOffset.Now.AddHours(24));
    }
    返回数据;
    }
    

    正如@Bond所提到的,如果要缓存的数据可能在24小时内发生更改,您可能还希望使用SQL缓存依赖项。如果是非常静态的,这将满足您的要求。

    您只是想将表的全部内容缓存到内存中,还是想使用LRU缓存缓存部分内容?听起来您并不是在寻找MVC框架提供的解决方案。MVC框架旨在为用户创建响应,并可以使用内置的OutputCache属性缓存这些响应。由于您不希望缓存响应,因此可能需要寻找一种更抽象的缓存查询结果的方法,该方法与MVC框架(memcached等)无关。实际上,在我的Instance中,我的表已经转换为CLR对象。所以,理想情况下,我只想缓存对象。@user70192——对。我认为MVC不是完成这项任务的合适工具。看到我的答案了。由于大部分时间都停留在.NET3.5上,我还没有听说过这个。它看起来很好--有点像一个开箱即用的memcached。它可以跨多台机器分发吗?它不是跨多台机器,它只是一个内存中的解决方案。它与ASP.NET缓存(
    System.Web.Caching
    )完全相同,但也可用于非ASP.NET应用程序。