Кэш это полезная штука, позволяющая сгладить изъяны реализации сложных выборок из базы или неоптимизированных расчетов. Шучу, в таких случаях лучше обратится с специалисту, чтобы сделать рефакторинг или переписать часть кода. Все-же остается масса сценариев, где лучше «перевести часть памяти но счет производительности». Сегодня я бы хотел поделится своим велосипедом с возможностью использования флага для очистки определенных ключей кэша. Он реализован на основе CacheDependency.
Вообщем, из коробки (не считая AggregateCacheDependency) есть только 2 CacheDependency — на основе файлов и на основе запроса SQL. В своих целях, я бы мог использовать последний, но лишний запрос и дополнительные настройки отбили аппетит. Так что я сделал свой. Основная идея — заставить очистится все ключи с помощью одно вызова статического метода. Переидем к коду:
public class StaticFlushCacheDependency : CacheDependency { protected static event EventHandler FlushEvent; public static void FlushDependencies(object sender) { if (FlushEvent != null) FlushEvent(sender, EventArgs.Empty); } protected void FlushEventHandler(object sender, EventArgs e) { NotifyDependencyChanged(sender, e); } public StaticFlushCacheDependency() { FlushEvent += FlushEventHandler; } protected override void DependencyDispose() { FlushEvent -= FlushEventHandler; base.DependencyDispose(); } }
Основную роль тут играет статический ивент, который и говорит всем слушателям очистить свой кэш.
Использовать его можно обычным способом:
//добавить улюч с зависимостью на наш метод Cache.Add(cacheKey, cacheObject, new StaticFlushCacheDependency(), DateTime.MaxValue, TimeSpan.FromMinutes(5), CacheItemPriority.Normal, null); //очистить кэш StaticFlushCacheDependency.FlushDependencies(new object());
Похожие статьи
- Нет похожих статей.