2011-11-05 9 views
19

Sto utilizzando la cache fornita da System.Runtime.Caching.MemoryCache.Posso eseguire l'iterazione su .NET4 MemoryCache?

Mi piacerebbe elencare sopra gli elementi della cache in modo che io possa invalidare (sfrattare quindi ricaricare) oggetti in quanto tali

foreach (var item in MemoryCache.Default) { item.invalidate() } 

Ma i documenti ufficiali found here Stato:

Importante: Recupero di un enumeratore per un'istanza di MemoryCache è un'operazione ad uso intensivo di risorse e di blocco. Pertanto, l'enumeratore non deve essere non utilizzato nelle applicazioni di produzione.

Sicuramente ci deve essere un modo semplice ed efficace per scorrere gli elementi della cache?

+0

Forse avrai in qualche modo bisogno di sapere in ANTICIPO quali sono le cose nella cache ... Ma questo significherebbe usare una matrice o qualcosa del genere. – sinni800

+0

Sì, è quello che sto facendo ora, ma è folle perché significa che sto monitorando ciò che la cache sta già monitorando! :) –

+0

Esattamente. Ma se la cache contiene grandi quantità di dati e il tuo array solo le informazioni per REACH i dati che tiene bene. – sinni800

risposta

9

I suggerimenti fatti finora sono stati grandi, ma il mio bisogno è ancora come indicato: per iterare sugli articoli della cache. Sembra un compito così semplice, e mi aspetto che la cache abbia internamente una qualche sorta di struttura delle liste. I documenti e il set di funzionalità per MemoryCache non sono disponibili.

Quindi, come discusso in precedenza, ho aggiunto un elenco alla mia classe dell'adattatore cache, che contiene un riferimento a ciascun elemento che inserisco nella cache. Se ho bisogno di iterare sulla cache - non solo per invalidare, ma per raccogliere statistiche, ecc. - poi ho iterato sulla mia lista.

Se il numero di elementi inseriti nella cache non cambia, questa è una soluzione ragionevole. Se il numero cambia, è necessario inserire/rimuovere tramite la classe dell'adattatore, in modo da mantenere l'elenco sincronizzato con la cache effettiva. Disordinato ma funziona, ed evita le penalità perf che alludono nei documenti.

Si spera che il provider di cache MemoryCache verrà arricchito nella prossima versione della piattaforma.

+0

Hehe, ero troppo lento :). Nessun problema! – sinni800

+1

Ho finalmente capito perché la classe è stata scritta così com'era. Quando si esegue l'iterazione sulla cache, è possibile che si verifichi una condizione di competizione perché un oggetto è sfrattato durante l'iterazione! Quindi è necessario bloccare la cache. MA, se hai il caso d'uso, come ho fatto io, in cui imposti gli elementi per non scadere, allora questo non è applicabile (ovviamente i miei articoli potrebbero essere sfrattati comunque, a causa della poca memoria, ma è un caso limite se la tua cache è piccolo e stai usando un server moderno). –

+0

Altre note. Questo mi ha fatto pensare che la mia soluzione è in realtà abbastanza * pericolosa * e forse stupida. È molto più sensato accettare l'hit perf e consentire a MemoryCache di essere bloccato durante l'iterazione, o di usare un altro modo per invalidare tutti i suoi elementi. Se la cache non viene invalidata spesso, allora va bene per vivere con il successo: basta pensare al tempo necessario per riscaldare una cache, invalidando l'intera cosa non è diverso. Tuttavia, i documenti avvisano di non usare l'enumeratore nel codice di produzione: mi chiedo perché? Forse ci sono altri problemi di cui non sono a conoscenza? –

1

Prendere in considerazione l'utilizzo di ChangeMonitors, che consente di rimuovere automaticamente voci obsolete quando vengono soddisfatte determinate condizioni.

Vedi Is there some sort of CacheDependency in System.Runtime.Caching?

Questo è simile a System.Web.Caching CacheDependencys, che consentono a sfrattare le voci quando i file o altre voci della cache cambiano.

-2

Nel 2014,

Questo è il modo corretto per ottenere tutti gli elementi:

Dim AllItems = MemoryCache.Default.Select(Of ItemType)(Function(O) O.Value)

Spero che questo aiuti qualcuno.

+2

A valle. Questo è lo stesso di "enumerare" gli elementi della cache che, come afferma OP dalla documentazione ufficiale, è "a uso intensivo di risorse" e dovrebbe essere evitato. Vedi [Il problema con l'enumerazione] (http://stackoverflow.com/a/22388943/219516). – publicgk

+0

Mi dispiace @publicgk Non ho letto completamente la domanda. – Dejisys

Problemi correlati