Кэширование данных в ASP.NET MVC 3

У меня есть приложение ASP.NET MVC 3, которое представляет собой набор веб-сервисов. Эти веб-сервисы предоставляются набором действий контроллера. Каждое действие контроллера запрашивает мою базу данных. Поскольку мои данные редко меняются, и устаревшие данные не представляют проблемы, я подумал, что я бы внедрил некоторое кэширование для повышения производительности. Мои цели:

Never cache a response to a user. Cache the database records for up to 24 hours. If 24 hours has passed, hit the database again.

Имеет ли это смысл? Я знаю, как предотвратить кеширование ответа. Я просто использую следующее:

HttpContext.Response.Cache.SetCacheability(cacheability)

Однако я не уверен, как кэшировать записи моей базы данных в памяти на срок до 24 часов. У кого-нибудь есть предложения как это сделать? Я даже не уверен, где искать.

Спасибо

 hatchet14 июн. 2012 г., 15:26
Вы просто хотите кэшировать все содержимое таблицы в память, или вы хотите кэшировать часть, используя кэш LRU?
 ken14 июн. 2012 г., 15:26
Это не похоже на то, что вы ищете решение, предоставляемое платформой MVC. Инфраструктура MVC предназначена для создания ответов для пользователя и может кэшировать эти ответы с помощью встроенного атрибута OutputCache. Поскольку вы не хотите, чтобы ответы кэшировались, вам может понадобиться более абстрактный метод кэширования результатов запросов, который не привязан к инфраструктуре MVC (memcached и т. Д.).
 user7019214 июн. 2012 г., 15:38
Я хочу кэшировать все содержимое таблицы в память. На самом деле, в моем учреждении моя таблица уже была преобразована в объекты CLR. Так что в идеале я бы просто хотел кешировать объекты.
 ken14 июн. 2012 г., 15:51
@ user70192 - Верно. Я не думаю, что MVC является подходящим инструментом для этой задачи. Смотри мой ответ.

Ответы на вопрос(5)

о чем вы говорите, не является ответственностью MVC. ASP.Net позволяет вам фиксировать только то, что он производит (и это, безусловно, реакция).

Если вы хотите кэшировать данные, может быть лучше кэшировать их в том же месте, где они были созданы - где-то в BL или Data Layer.

Вы можете сделать что-то подобное:

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.

Надеюсь, это поможет или, по крайней мере, заставит вас задуматься.

Зависимость кеша SQL.

Я не уверен, что вы можете настроить срок действия кэша до 24 часов, но с зависимостью от кэша вам может и не понадобиться - это приведет к аннулированию кэша, как только произойдет обновление базы данных (то есть должно быть более эффективным, чем истечение времени стратегия).

Вот является хорошей статьей, в которой обсуждаются некоторые методы, связанные с производительностью для ASP.NET MVC 3, и упоминается кэширование.

System.Runtime.Caching пространство имен (или кеш ASP.NET, но он более старый и может использоваться только в веб-приложениях).

Вот пример функции, которую вы можете использовать, чтобы обернуть ваш текущий механизм поиска данных. Вы можете изменить параметры в MemoryCache. Добавить, чтобы контролировать объем кэширования, но вы запросили 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, вы также можете рассмотреть возможность использования зависимости кэша SQL, если данные, которые вы кэшируете, могут измениться в течение 24 часов. Если он довольно статичен, он будет делать то, что вы просили.

 14 июн. 2012 г., 17:11
Это не на нескольких машинах, это просто решение в памяти. Он точно такой же, как кеш ASP.NET (System.Web.Caching) но доступно и для приложений, не являющихся ASP.NET.
 14 июн. 2012 г., 17:07
Будучи в основном зависшим в .NET 3.5, я не слышал об этом. Это выглядит красиво - вроде как готовый memcached. Распространяется ли он на несколько машин?

хранения данных, поэтому нет встроенных средств для кэширования хранимых данных.

OutputCache Атрибут может использоваться для кэширования ответа сервера. Но вы прямо заявили, что это не то, что вы хотите сделать.

Тем не менее, вы все еще можете использовать встроенныйOutputCache если вы хотите остаться в рамках MVC. Рассмотрите возможность предоставления данных, которые вы хотите кэшировать, как результат JSON.

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

Строка JSON в/ControllerName/GetMyData будет кэшироваться в течение 24 часов, поэтому фактический запрос будет выполняться только один раз в день. Это означает, что вам нужно реализовать вызов AJAX на вашей последней странице или сделать еще один HTTP-вызов с вашего сервера. Ни один из них не идеален.

Я бы искал другое решение вашей проблемы вне рамок MVC. РассматриватьMemcached, который был создан именно для этой цели.

Ваш ответ на вопрос