C # - Вставка и удаление из кэша - PullRequest
16 голосов
/ 20 мая 2010
  1. Если я вставляю в Cache, присваивая значение:

    Cache ["key"] = значение;

    какое время истечения?

  2. Удаление того же значения из Cache:

    Я хочу проверить, находится ли значение в Cache на if(Cache["key"]!=null), лучше ли удалить его из Cache на Cache.Remove("key") или Cache["key"]=null?

- Изменить -

После попытки Cache.Remove и Cache["key"]=null НЕ ИСПОЛЬЗУЙТЕ Cache["key"]=null, так какон будет генерировать исключения при использовании в стрессе.

Ответы [ 4 ]

11 голосов
/ 20 мая 2010

1 Cache["key"] = value равно Cache.Insert("key", value)

MSDN Cache.Insert - метод (String, Object):

Этот метод перезапишет существующий элемент кэша, ключ которого совпадает с ключом параметр. Объект добавлен в кеш, используя эту перегрузку Вставить метод вставляется без файла или кэш-зависимостей, приоритет По умолчанию скользящее значение срока действия NoSlidingExpiration и абсолют срок действия NoAbsoluteExpiration.

2 Лучше удалять значения из кэша с помощью Cache.Remove («ключ»). Если вы используете Cache["key"] = null, это равно Cache.Insert("key", null). Взгляните на реализацию Cache.Insert:

public void Insert(string key, object value)
{
    this._cacheInternal.DoInsert(true, key, value, null, NoAbsoluteExpiration, NoSlidingExpiration, CacheItemPriority.Normal, null, true);
}

и CacheInternal.DoInsert:

internal object DoInsert(bool isPublic, string key, object value, CacheDependency dependencies, DateTime utcAbsoluteExpiration, TimeSpan slidingExpiration, CacheItemPriority priority, CacheItemRemovedCallback onRemoveCallback, bool replace)
{
    using (dependencies)
    {
        object obj2;
        CacheEntry cacheKey = new CacheEntry(key, value, dependencies, onRemoveCallback, utcAbsoluteExpiration, slidingExpiration, priority, isPublic);
        cacheKey = this.UpdateCache(cacheKey, cacheKey, replace, CacheItemRemovedReason.Removed, out obj2);
        if (cacheKey != null)
        {
            return cacheKey.Value;
        }
        return null;
    }
}

Сравните это с Cache.Remove:

public object Remove(string key)
{
    CacheKey cacheKey = new CacheKey(key, true);
    return this._cacheInternal.DoRemove(cacheKey, CacheItemRemovedReason.Removed);
}

CacheInternal.DoRemove

internal object DoRemove(CacheKey cacheKey, CacheItemRemovedReason reason)
{
    object obj2;
    this.UpdateCache(cacheKey, null, true, reason, out obj2);
    return obj2;
}

И, наконец, Cache.Remove("key") гораздо лучше читается, чем Cache["key"] = null

3 голосов
/ 20 мая 2010
  1. Добавьте его в кэш, используя Добавление элемента в кэш с политиками истечения срока действия , чтобы указать точные временные рамки.
    Что касается значения по умолчанию, см. Кэширование ASP.NET: методы и рекомендации - раздел под названием Хранение данных в кэше указывает:

    Cache ["key"] = "value";

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

  2. Поскольку кеш принимает объект - Null это объект! если вам нужна запись со значением NULL, используйте Cache["key"]=null, если вы не хотите вводить с именем «ключ», используйте Cache.Remove("key")

2 голосов
/ 20 мая 2010
  1. Если время истечения не указано NoSlidingExpiration и NoAbsoluteExpiration установлено, где NoAbsoluteExpiration - максимально возможное значение DateTimeValueСледовательно, он остается там навсегда, пока не будет удален

  2. Лучше удалить кэш

0 голосов
/ 20 мая 2010
  1. Я считаю, что по умолчанию время истечения срока действия кэша по умолчанию отсутствует, поэтому я считаю, что оно остается там до перезагрузки пула приложений.

  2. Это единственный известный мне способ проверить, существует ли элемент в кэше

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