2009-04-01 3 views
11

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

Как я пытался сделать это, например, так:

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

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

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

ответ

19

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

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); 
} 

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

+0

Вот чего я боялся. Спасибо –

+0

Красиво сделано. Хотя в следующей версии .NET я бы хотел увидеть метод Remove во всех коллекциях, который принимает регулярное выражение в качестве входных данных. – Vnuk

+1

Лямбда будет работать еще лучше. – Audrius

2

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

0

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

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

0

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

1

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

Смежные вопросы