swanrnd
@swanrnd
Издатель HTML5 игр

Как использовать CacheDependency в ASP.NET?

Я использую так кеш.
Cache.Get("prefix_"+xxx+"_"+yyyy);
Cache.Insert("prefix_"+xxx+"_"+yyyy, data, null, DateTime.Now.AddSeconds(1), Cache.NoSlidingExpiration, CacheItemPriority.High, null);

Это значительно снизило нагрузку на БД.
Но данные часто меняются и переполучать раз в 1 секунду не совсем правильно.

Есть скрипт отвечающий за обновление. Когда я его запускаю, то все yyyy, при определенном xxx становятся не актуальны.
Пример информациии в кеше.
prefix_1000_34
prefix_1000_36
prefix_1000_37
prefix_1000_39
prefix_1000_51
prefix_2000_34
prefix_2000_39
prefix_2004_18
prefix_2004_25
prefix_2004_48

При запросе с параметром 2000 неактуальными становятся только: prefix_2000_34, prefix_2000_39. Остальные силу свою не теряют.

Я видел CacheDependency, которые зависят от БД или от файла, но мне не нужно это.
Мне нужно, что бы в один прекрасный момент некоторый набор данные в кеше сделать неактуальными.

У меня нет идей как их выделять.
Единственное что мне пришло в голову, это использовать файл и изменять его когда данные становятся не актуальными.
Но я думаю, есть более нормальный вариант.
  • Вопрос задан
  • 2377 просмотров
Решения вопроса 1
Попробуйте так

1. Свой CacheDependency
class CustomDependencyManager {
  class CustomDependency : CacheDependency {
    public void Invalidate() {
      NotifyDependencyChanged(this, EventArgs.Empty);
     }
  }
  public static CustomDependencyManager Instance = new CustomDependencyManager();

  private readonly ConcurrentDictionary<string, CustomDependency> dependencies = new ConcurrentDictionary<string, CustomDependency>();

  private CustomDependency GetCacheDependencyInternal(string xxx) {
    return dependencies.GetOrAdd(xxx, s => new CustomDependency());
  }

  public void Invalidate(string xxx) {
    GetCacheDependencyInternal(xxx).Invalidate();
  }
  
  public CacheDependency For(string xxx) {
    GetCacheDependencyInternal(xxx);            
  }
}


2. Когда нужно, сбрасываем кеш

Cache.Insert("prefix_"+xxx+"_"+yyyy, data, CustomDependencyManager.Instance.For(xxx), DateTime.Now.AddSeconds(1), Cache.NoSlidingExpiration, CacheItemPriority.High, null);

...
...
// Пора сбросить кеш 
CustomDependencyManager.Instance.Invalidate(xxx);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы