12

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

  1. 永远不要缓存对用户的响应。
  2. 将数据库记录缓存长达 24 小时。如果 24 小时过去了,请再次访问数据库。

那有意义吗?我知道如何防止响应缓存。我只使用以下内容:

HttpContext.Response.Cache.SetCacheability(cacheability)

但是,我不确定如何将我的数据库记录缓存在内存中长达 24 小时。有人对如何做到这一点有任何建议吗?我什至不知道在哪里看。

谢谢

4

5 回答 5

8

您可以使用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;
}

正如@Bond 所提到的,如果您缓存的数据可能在 24 小时内发生变化,您可能还希望查看使用 SQL 缓存依赖项。如果它非常静态,这将按照您的要求进行。

于 2012-06-14T14:51:29.727 回答
2

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

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

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

[OutputCache(Duration = 86400)]
public JsonResult GetMyData() {
    var results = QueryResults();
    return Json(results);
}

JSON 字符串 at/ControllerName/GetMyData将被缓存 24 小时,因此实际查询每天只运行一次。这意味着您必须在最终页面上实现 AJAX 调用,或者从服务器进行另一个 HTTP 调用。这些都不是理想的。

我会在 MVC 框架之外为您的问题寻找另一种解决方案。考虑一下memcached,它正是为此目的而创建的。

于 2012-06-14T13:49:50.680 回答
2

你所说的不完全是 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;
        }
    }
}

String data在此处显示您的实际数据。添加此类后,将您的GetData()方法替换为DataCacher.Data.

希望它可以帮助或至少引导您进行进一步的思考。

于 2012-06-14T14:44:01.177 回答
1

如果您使用的是 MSSQL,您可能需要查看SQL Cache Dependency

我不确定您是否可以将缓存到期配置为 24 小时,但您可能不需要缓存依赖项 - 只要数据库有更新,它就会使缓存失效(即应该比时间到期更有效战略)。

于 2012-06-14T13:58:26.173 回答
0

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

于 2012-06-14T13:23:19.360 回答