2011-01-14 11 views
7

Sto provando a convertire una soluzione utilizzando EntLib nell'utilizzo della caching AppFabric. Con l'aiuto di alcuni metodi di estensione questo è un processo abbastanza indolore.ASP.Net AppFabric Cache manca metodi Flush/Clear e Count/GetCount?

metodi di estensione che uso:

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

Ma ci sono due caratteristiche di EntLib trovo difficile da convertire. Vale a dire "Count" (contando il numero di chiavi nella cache) e "Flush" (rimuovendo tutti i dati dalla cache). Entrambi potrebbero essere risolti se potessi scorrere le chiavi nella cache.

C'è un metodo chiamato ClearRegion(string region), ma che mi ha richiesto di specificare un nome di regione su tutti i metodi Get/Put/Add che uso, il che richiederebbe un lavoro manuale soggetto a errori.

C'è un modo per ottenere un elenco di chiavi nella cache?
C'è un nome regione predefinito che posso usare?
Come posso svuotare la cache quando non ho usato il nome di una regione?

+0

Il codice mi ha permesso di sostituire ".Count == 0" con il metodo .Contains() sopra. –

risposta

10

Vedi my previous answer per il mio speculazione di come la cache funziona internamente quando non si specifica una regione, e come è possibile ottenere il numero di oggetti che non si trovano in una regione di nome.

Siamo in grado di costruire un metodo Flush con la stessa tecnica:

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

Come ho detto lì, credo che le regioni nominate sono probabilmente la strada da percorrere - mi pare che il loro utilizzo risolve più problemi di quello che crea.

+0

Grazie. Sembra che abbia creato automaticamente un intero set di regioni. Default_Region_0000 attraverso Default_Region_1023. La cancellazione di tutti mostra che sono vuoti (Get-CacheStatistics). –

+10

Se si utilizzano le regioni, si perde la parte distribuita della cache man mano che le regioni vengono create su un solo host della cache. Penso, in generale, che tu voglia stare lontano dalle regioni a meno che tu non abbia una ragione molto specifica per usarle (cioè i tag). –

0

Se qualcuno avrà problemi in futuro (come me) - ecco il codice completo per svuotare la cache.

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