2011-01-14 5 views
7

Estoy tratando de convertir una solución usando EntLib para usar el almacenamiento en caché de AppFabric. Con la ayuda de algunos métodos de extensión, este es un proceso bastante libre de dolor.Caché de AppFabric de ASP.Net que falta métodos Flush/Clear y Count/GetCount?

Los métodos de extensión que usan:

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

Pero hay dos características de EntLib me parecen difíciles de convertir. A saber, "Count" (conteo de número de claves en caché) y "Flush" (eliminación de todos los datos de la caché). Ambos podrían resolverse si pudiera repetir las claves en caché.

Hay un método llamado ClearRegion(string region), pero eso requería que especificara un nombre de región en todos los métodos Get/Put/Add que utilizo, lo que requeriría algún trabajo manual propenso a errores.

¿Hay alguna manera de obtener una lista de claves en la memoria caché?
¿Existe un nombre de región predeterminado que pueda usar?
¿Cómo puedo vaciar el caché cuando no he usado un nombre de región?

+0

El código me permitió reemplazar ".Count == 0" con el método .Contains() anterior. –

Respuesta

10

Ver my previous answer para mi la especulación en cuanto a cómo funciona la memoria caché internamente cuando no se especifica una región, y cómo se puede obtener el número de objetos que no están en una región llamada.

Podemos construir un método Flush utilizando la misma técnica:

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

Como dije allí, creo regiones nombradas son probablemente el camino a seguir - me parece que el uso de los resuelve más problemas de lo que crea

+0

Gracias. Parece que ha creado un conjunto de regiones automáticamente. Default_Region_0000 a Default_Region_1023. Al borrar todos, se muestra que están vacíos (Get-CacheStatistics). –

+10

Si usa regiones, perderá la parte distribuida de la memoria caché ya que las regiones se crean solo en un servidor de caché. Creo que, en general, querrá mantenerse alejado de las regiones a menos que tenga una razón muy específica para usarlas (es decir, etiquetas). –

0

Si alguien tendrá problemas en el futuro (como yo) - aquí está el código completo para borrar el caché.

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