2011-01-14 6 views
7

Próbuję przekonwertować rozwiązanie przy użyciu EntLib do korzystania z buforowania AppFabric. Dzięki kilku metodom rozszerzenia jest to dość bezbolesny proces.ASP.Net AppFabric Cache brakuje metod Flush/Clear i Count/GetCount?

rozszerzenie metod używam:

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); 
}

Ale istnieją dwie cechy EntLib mogę znaleźć trudno przeliczyć. Mianowicie "Count" (liczenie liczby kluczy w pamięci podręcznej) i "Flush" (usuwanie wszystkich danych z pamięci podręcznej). Oba mogą być rozwiązane, jeśli mogę iterować klucze w pamięci podręcznej.

Istnieje metoda o nazwie ClearRegion(string region), ale to wymagało określenia nazwy regionu we wszystkich metodach Get/Put/Add, których używam, co wymagałoby ręcznej, podatnej na błędy pracy.

Czy istnieje sposób na uzyskanie listy kluczy w pamięci podręcznej?
Czy istnieje domyślna nazwa regionu, której mogę użyć?
Jak mogę opróżnić pamięć podręczną, gdy nie używam nazwy regionu?

+0

Kod pozwolił mi zastąpić ".Count == 0" powyższą metodą .Contains(). –

Odpowiedz

10

Zobacz my previous answer dla mojego spekulacji, jak pamięć podręczna działa wewnętrznie, gdy nie określają obszar, i jak można uzyskać liczbę obiektów, które nie są w nazwie regionu.

Możemy zbudować metodę Flush stosując tę ​​samą technikę:

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

Jak powiedziałem nie, myślę, że wymienione regiony prawdopodobnie droga - wydaje mi się, że korzystanie z nich rozwiązuje więcej problemów niż tworzy.

+0

Dzięki. Wygląda na to, że automatycznie utworzył cały zestaw regionów. Default_Region_0000 do Default_Region_1023. Wyczyszczenie wszystkich programów wskazuje, że są puste (Get-CacheStatistics). –

+10

Jeśli użyjesz regionów, stracisz rozproszoną część pamięci podręcznej, ponieważ regiony są tworzone tylko na jednym hoście pamięci podręcznej. Myślę, że ogólnie rzecz biorąc będziesz chciał trzymać się z dala od regionów, chyba że masz konkretny powód, aby z nich korzystać (tj. Tagi). –

0

Jeśli ktokolwiek będzie miał problemy w przyszłości (jak ja) - oto pełny kod do czyszczenia pamięci podręcznej.

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); 
     } 
Powiązane problemy