2011-02-08 20 views
13

Estoy haciendo uso del nuevo espacio de nombres de almacenamiento en caché de .NET 4.0: System.Runtime.Caching.¿Cómo inspeccionar las políticas de caché dentro de System.Runtime.Caching.ObjectCache?

Ahora, estoy haciendo un prototipo/jugando con la nueva API, con el fin de encontrar la mejor opción para la aplicación real.

En línea con esto, estoy tratando de crear una página (ASP.NET MVC) que, básicamente, todo lo vuelca en la memoria caché, en particular la siguiente información:

  • caché de claves
  • caché de objetos
  • política de caché (fecha de caducidad, etc.)
  • dependencias de caché (si los hay)

sin embargo, me parece que no puede conseguir cualquier cosa excepto la llave/objeto.

Aquí está el código que actualmente estoy jugando con:

public ActionResult Index() 
{ 
    var cache = MemoryCache.Default; 

    // i can get the list of cache keys like this: 
    var cacheKeys = cache.Select(kvp => kvp.Key).ToList(); 

    // i can also get a strongly-typed "CacheItem" like this: 
    CacheItem item = cache.GetCacheItem("someKey"); 

} 

yo habría esperado la clase "CacheItem" expondría a la información que necesito (caducidad, dependencias, etc. - al menos como "captadores") .

Pero no es así. Todo lo que tiene son propiedades para la clave, el valor y el nombre de la región.

¿Cómo puedo inspeccionar los elementos en la memoria caché y escupir la información que necesito?

¿Hay un espacio de nombres/clase que me falta?

EDITAR

Parece que hay una clase ChangeMonitor, pero de nuevo - esto no da información de caducidad, sólo se le permite suscribirse a los eventos cuando se eliminan elementos de caché.

Hay debe ser una forma de simplemente agarrar los elementos en la memoria caché, y cuando caducan.

EDIT 2

No sé si esto debería ser una cuestión independiente, sino también - Estoy confundido en cuanto a qué curso de la vida que debería dar mi ObjectCache. MSDN dice que no es un singleton, y de hecho puede crear varias instancias de ObjectCache. Sin embargo, ¿qué significa eso, tengo que usar un singleton completamente bloqueado cuando accedo a la instancia de ObjectCache?

Respuesta

9

No me parece que haya una forma de recuperar CacheItemPolicy una vez que se haya agregado a la colección de caché.

La mejor forma de evitar esto es almacenar en caché el objeto de política junto con el elemento que desea almacenar en caché, pero simplemente agregando "Política" al nombre de la clave para que pueda recuperar la política más adelante. Obviamente, esto supone que tienes control sobre la realidad de agregar el elemento a la memoria caché en primer lugar. Ejemplo a continuación:

public ActionResult Index() 
    { 
     string key = "Hello"; 
     string value = "World"; 

     var cache = MemoryCache.Default; 
     CacheItemPolicy policy = new CacheItemPolicy(); 
     policy.AbsoluteExpiration = DateTime.Now.AddDays(1); 
     cache.Add(new CacheItem(key, value), policy); 
     cache.Add(new CacheItem(key + "Policy", policy), null); 

     CacheItem item = cache.GetCacheItem(key); 
     CacheItem policyItem = cache.GetCacheItem(key + "Policy"); 
     CacheItemPolicy policy2 = policyItem.Value as CacheItemPolicy; 

     ViewBag.Message = key + " " + value; 

     return View(); 
    } 
+0

Sí, pensé en esto.Tal vez solo para crear prototipos, haré esto; luego, cuando termine, volveré a cambiar el código a la normalidad. Aún así, esperaba un programa de monitor de caché ligero en el servidor en vivo, parece que no será posible. – RPM1984

Cuestiones relacionadas