Удаление определенных элементов из кеша (ASP.NET)

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

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

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

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

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

Ответ 1

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

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

Вы можете написать подкласс CacheDependency, который делает недействительным соответствующим образом.

Ответ 3

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

Ответ 4

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

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

Ответ 5

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