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

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

  • Никогда не кэшируйте ответ пользователю.
  • Кэш записей базы данных до 24 часов. Если прошло 24 часа, снова нажмите базу данных.

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

HttpContext.Response.Cache.SetCacheability(cacheability)

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

Спасибо

Ответ 1

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

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

Ответ 2

Структура MVC устойчива-агностична. Нет встроенных средств для хранения данных, поэтому нет встроенных средств для кэширования сохраненных данных.

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

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

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

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

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

Ответ 3

То, о чем вы говорите, это не совсем ответственность 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.

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

Ответ 4

Если вы используете MSSQL, вы можете посмотреть Зависимость кэширования SQL.

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

Ответ 5

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