Есть ли какие-либо неприятные побочные эффекты, если я заблокирую метод HttpContext.Current.Cache.Insert - PullRequest
2 голосов
/ 04 мая 2010

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

Сам процесс извлечения и вставки данных в кеш должен занимать не более 1 секунды, с чем мы можем жить. Что еще более важно, я не хочу, чтобы несколько потоков потенциально все одновременно выполняли метод вставки.

Пример кода выглядит примерно так:

public static readonly object _syncRoot = new object();

if (HttpContext.Current.Cache["key"] == null)
{
  lock (_syncRoot)
  {
    HttpContext.Current.Cache.Insert("key", "DATA", null, DateTime.Now.AddMinutes(5), Cache.NoSlidingExpiration, CacheItemPriority.Normal, null);
  }
}

  Response.Write(HttpContext.Current.Cache["key"]);

1 Ответ

2 голосов
/ 04 мая 2010

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

Такая блокировка только на самом Cache.Insert бесполезна, поскольку этот метод является поточно-ориентированным. Такая блокировка может быть полезна для предотвращения двойного извлечения данных, но в этом случае вам следует рассмотреть возможность использования блокировки с двойной проверкой:

var  data = HttpContext.Current.Cache["key"];
if (data == null)
{
  lock (_syncRoot)
  {
    // Here, check again for null after the lock.
    var  data = HttpContext.Current.Cache["key"];
    if (data == null)
    {
        var data = [RETRIEVE DATA]
        HttpContext.Current.Cache.Insert("key", data, null, ...);
  }
}
return data;

Но на ваш главный вопрос. Помимо риска блокировки на слишком длительный период времени, вызывающего большие задержки в вашем веб-приложении, не о чем беспокоиться :-). Замок вокруг Cache.Insert сам по себе не причинит вам вреда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...