2011-01-14 2 views
7

Я пытаюсь преобразовать решение, используя EntLib, в использование кэширования AppFabric. С помощью нескольких методов расширения это довольно безболезненный процесс.ASP.NET AppFabric Cache отсутствует методы Flush/Clear и Count/GetCount?

методы расширения я использую:

public static bool Contains(this DataCache dataCache, string key) 
{ 
    return dataCache.Get(key) != null; 
} 

public static object GetData(this DataCache dataCache, string key) 
{ 
    return dataCache.Get(key); 
}

Но есть две особенности EntLib я нахожу трудно преобразовать. А именно «Count» (подсчет количества ключей в кеше) и «Flush» (удаление всех данных из кеша). Оба могут быть решены, если я могу перебирать ключи в кеше.

Существует метод под названием ClearRegion(string region), но для этого мне нужно указать имя региона во всех методах Get/Put/Add-methods, которые потребуются для ручной работы с ошибкой.

Есть ли способ получить список ключей в кеше?
Есть ли название региона по умолчанию, которое я могу использовать?
Как сбросить кеш, если я не использовал имя региона?

+0

Этот код позволил мне заменить «.Count == 0» на метод .Contains() выше. –

ответ

10

См my previous answer моей спекуляции о том, как кэш работает внутри, когда вы не указали регион, и как вы можете получить количество объектов, которые не находятся в названном регионе.

Мы можем построить Flush метод используя ту же технику:

public void Flush (this DataCache cache) 
{ 
    foreach (string regionName in cache.GetSystemRegions()) 
    {  
     cache.ClearRegion(regionName) 
    } 
} 

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

+0

Спасибо. Кажется, он создал целый набор регионов автоматически. Default_Region_0000 через Default_Region_1023. Очистка всех показывает, что они пусты (Get-CacheStatistics). –

+10

Если вы используете регионы, вы потеряете распределенную часть кеша, так как регионы создаются только на одном кэше. Я думаю, в общем, вы захотите держаться подальше от регионов, если у вас нет особых причин использовать их (т. Е. Теги). –

0

Если у кого-то возникнут проблемы в будущем (например, я) - вот полный код для очистки кеша.

private static DataCacheFactory _factory; 
     private const String serverName = "<machineName>"; 
     private const String cacheName = "<cacheName>"; 

     static void Main(string[] args) 
     { 
      Dictionary<String, Int32> cacheHostsAndPorts = new Dictionary<String, Int32> { { serverName, 22233 } }; 
      Initialize(cacheHostsAndPorts); 
      DataCache cache = _factory.GetCache(cacheName); 
      FlushCache(cache); 
      Console.WriteLine("Done"); 
      Console.ReadLine(); 
     } 

     private static void FlushCache(DataCache cache) 
     { 
      foreach (string regionName in cache.GetSystemRegions()) 
      { 
       cache.ClearRegion(regionName); 
      } 
     } 

     public static void Initialize(Dictionary<String, Int32> cacheHostsAndPorts) 
     { 
      var factoryConfig = new DataCacheFactoryConfiguration 
      { 
       Servers = cacheHostsAndPorts.Select(cacheEndpoint => new DataCacheServerEndpoint(cacheEndpoint.Key, cacheEndpoint.Value)) 
      }; 

      _factory = new DataCacheFactory(factoryConfig); 
     } 
Смежные вопросы