Удаление определенных элементов из кеша (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; как только количество элементов кэша превысит лимит, менеджер кэша автоматически очистит кеш.