Картинка блога

Кэш это полезная штука, позволяющая сгладить изъяны реализации сложных выборок из базы или неоптимизированных расчетов. Шучу, в таких случаях лучше обратится с специалисту, чтобы сделать рефакторинг или переписать часть кода. Все-же остается масса сценариев, где лучше «перевести часть памяти но счет производительности». Сегодня я бы хотел поделится своим велосипедом с возможностью использования флага для очистки определенных ключей кэша. Он реализован на основе 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());

Похожие статьи

    Нет похожих статей.