2011-02-08 4 views
13

Sto facendo uso del nuovo spazio dei nomi di Caching .NET 4.0: System.Runtime.Caching.Come esaminare i criteri della cache in System.Runtime.Caching.ObjectCache?

Ora, sto solo facendo qualche prototipo/giocherellando con la nuova API, al fine di trovare la soluzione migliore per l'app reale.

In linea con questo, sto cercando di creare una pagina (ASP.NET MVC) che scarica in fondo tutto ciò nella cache, in particolare le seguenti informazioni:

  • cache Key Object
  • Cache
  • politica cache (data di scadenza, ecc)
  • dipendenze della cache (se presenti)

Tuttavia, io non riesco a ottenere nulla tranne la chiave/oggetto.

Ecco il codice che sto attualmente in riproduzione 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"); 

} 

avrei sperato classe "CacheItem" esporrebbe l'informazione che desidero (scadenza, dipendenze, ecc - almeno come "getter") .

Ma non è così. Tutto ciò che ha sono proprietà per chiave, valore e nome della regione.

Come posso controllare gli articoli nella cache e sputare le informazioni che ho bisogno?

C'è uno spazio dei nomi/classe che mi manca?

EDIT

Sembra che ci sia una classe ChangeMonitor, ma ancora una volta - questo non dà informazioni di scadenza, permette solo di iscriversi a eventi quando gli elementi della cache vengono rimossi.

deve essere un modo per afferrare gli elementi nella cache e quando scadono.

EDIT 2

Non so se questo dovrebbe essere una domanda separata, ma anche - io sono confuso su ciò che la vita dovrei dare il mio ObjectCache. MSDN dice che non è un singleton e puoi infatti creare più istanze di ObjectCache. Che cosa significa, però, devo usare un singleton completamente bloccato quando si accede all'istanza di ObjectCache?

risposta

9

Non mi sembra che ci sia un modo per recuperare CacheItemPolicy dopo che è stato aggiunto alla raccolta della cache.

Il modo migliore per risolvere questo problema è quello di memorizzare nella cache l'oggetto della politica insieme all'elemento che si desidera memorizzare nella cache, aggiungendo semplicemente "Politica" al nome della chiave in modo da poter recuperare successivamente la politica. Questo ovviamente presuppone che tu abbia il controllo sull'effettiva aggiunta dell'elemento alla cache in primo luogo. Esempio di seguito:

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ì, ci ho pensato.Forse solo per la prototipazione, lo farò, quindi cambierò il codice alla normalità quando finisco. Comunque, speravo in un programma di monitoraggio della cache leggero sul server live - sembra che non sia possibile. – RPM1984

Problemi correlati