Удаление определенных элементов из кэша (ASP.NET) - PullRequest
11 голосов
/ 01 апреля 2009

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

То, как я пытался это сделать, выглядит так:

    foreach (DictionaryEntry CachedItem in Cache)
    {
        string CacheKey = CachedItem.Key.ToString();
        if(CacheKey.StartsWith(CACHE_PREFIX){
            Cache.Remove(CacheKey);
        }
    }

Могу ли я сделать это более эффективно?

Я рассмотрел создание временного файла и добавление элементов с зависимостью от файла, а затем просто удаление файла. Это сверх убийства?

Ответы [ 5 ]

20 голосов
/ 01 апреля 2009

Вы не можете удалять элементы из коллекции, пока выполняете итерацию по ней, поэтому вам нужно сделать что-то вроде этого:

List<string> itemsToRemove = new List<string>();

IDictionaryEnumerator enumerator = Cache.GetEnumerator();
while (enumerator.MoveNext())
{
    if (enumerator.Key.ToString().ToLower().StartsWith(prefix))
    {
        itemsToRemove.Add(enumerator.Key.ToString());
    }
}

foreach (string itemToRemove in itemsToRemove)
{
    Cache.Remove(itemToRemove);
}

Этот подход хорош, он быстрее и проще, чем зависимости кеша.

2 голосов
/ 01 апреля 2009

Вы могли бы написать подкласс CacheDependency, который делает недействительным соответственно.

1 голос
/ 09 июля 2009

Вы должны хранить еще один элемент в кеше только для этой цели. Допустим, вы кэшируете 10.000 элементов с ключами вроде: cache_prefix_XXX. Таким образом, добавив элемент с только cache_prefix в качестве ключа и добавив остальные из них с зависимостью от этого ключа, вы можете контролировать удаление всех из них. Одна вещь, чтобы рассмотреть, были бы приоритетами. Установите для этого конкретного элемента более высокий приоритет, чем для фактических элементов данных.

0 голосов
/ 16 апреля 2009

Для очистки кеша, я предполагаю, что вам нужно запустить его вручную, когда вы заметите, что слишком много элементов кеша. Используя блок MS lib cache, он может выполнить эту работу автоматически. В конфигурации кеширования; вы можете установить свойство MaximumElementsInCacheBeforeScavenging; как только количество элементов кеша превысит лимит, менеджер кеша автоматически очистит кеш.

0 голосов
/ 01 апреля 2009

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

Ваше решение подходит мне, если вы не делаете что-то экстремальное.

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