Как кэшировать данные на корневом уровне (приложения) при использовании .NET для веб-приложения?

Настраивать

.NET 4.5, .NET MVC 4, IIS 8, c #

Задний план

Я использую HttpContext.Current.Cache в течение многих лет для кеширования созданных объектов для одного пользовательского сеанса, чтобы повысить производительность. Это прекрасно работает.

Теперь мне нужно кэшировать созданные объекты на корневом уровне, чтобы любой пользователь из любого браузера, запрашивающий страницу с информацией, которая должна быть кэширована, получал эти данные из кеша, а не только что созданный объект, который извлекал данные из бэкэнда.

Итак, я изменил свое кеширование с HttpContext.Current.Cache на HttpRuntime.Cache. Вот пример добавления объекта в кеш:

/// <summary>
    ///     Insert value into the cache using
    ///     appropriate name/value pairs
    /// </summary>
    /// <typeparam name="T">Type of cached item</typeparam>
    /// <param name="o">Item to be cached</param>
    /// <param name="key">Name of item</param>
    public static void Add<T>(T o, string key)
    {
        if (!string.IsNullOrEmpty(key))
        {
            // NOTE: Apply expiration parameters as you see fit.
            HttpRuntime.Cache.Insert(
                key,
                o,
                null,
                DateTime.Now.AddDays(30),
                Cache.NoSlidingExpiration);
        }
    }

Проблема

После этого я загрузил страницу на свой рабочий стол в Chrome и ожидал, что она будет загружаться медленно, поскольку первый запрос должен вызвать базу данных и построить мои объекты.

Затем я перешел на другой компьютер и вызвал ту же страницу, и это заняло столько же времени! После первого запроса на каждом другом ПК / браузере все стало быстро, как и должно быть. Это говорит о том, что мои объекты по-прежнему кэшируются для каждого сеанса.

Возможность

Если никто не замечает очевидную ошибку, которую я сделал, мне интересно, возможно, мои проблемы связаны с кластером серверов, распространяющим приложение. Итак, если кто-то знает об этом, я использую Rackspace Cloud Hosting.


person Matt Cashatt    schedule 28.08.2014    source источник


Ответы (1)


Уверен, вы обнаружите, что HttpContext.Current.Cache не зависит от пользователя. Вот что такое Сессия. Как указано здесь ...

Разница между HttpRuntime.Cache и HttpContext.Current.Cache?

... нет никакой разницы между использованием HttpContext.Current.Cache и HttpRuntime.Cache.

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

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

Как анализировать производительность запросов в Приложение ASP.NET MVC?

Вы также можете использовать такой инструмент, как fiddler или charles proxy, чтобы помочь вам определить, куда уходит время на клиенте.

Вероятно, вам также нужно подумать об инструменте ведения журнала, вы должны иметь возможность легко определить по информации журнала, происходит ли попадание в ваш кеш или вы загружаете данные из базы данных, угадывать - это не то, что вы обычно делаете в таких вещах. Пользуюсь Log4net ...

http://www.codeproject.com/Articles/14819/How-to-use-log-net

http://logging.apache.org/log4net/

Он имеет много разных средств ведения журнала, например. электронная почта, файл журнала, таблица базы данных и многое другое.

person Mick    schedule 28.08.2014