2009-11-24 12 views
12

Sto tentando di memorizzare un valore di prezzo nella cache utilizzando HttpRuntime.Cache.Insert(), ma sembra che mantenga il valore per un paio d'ore o qualcosa prima di cancellarlo . Che cosa sto facendo di sbagliato? Voglio che il valore rimanga nella cache per 3 giorni.C# HttpRuntime.Cache.Insert() Non contiene il valore memorizzato nella cache

HttpRuntime.Cache.Insert(CacheName, Price, null, DateTime.Now.AddDays(3), TimeSpan.Zero); 
+0

Come si verifica che sia stato eliminato? –

+0

@ J.W. : Cache [CacheName] sarà null se la voce è stata rimossa/scaduta. – RickNZ

risposta

31

Risposta breve

vostro pool di applicazioni o sito è attualmente in arresto troppo presto. Estendere il timeout di inattività sul sito, estendere la durata del pool di applicazioni per il pool che esegue il sito. Aumentare l'allocazione di memoria e i limiti di richiesta.

risposta completa

Se vuoi sapere quando e perché qualcosa è stato rimosso dalla cache, è necessario accedere alla rimozione voce utilizzando l'opzione CacheItemRemovedCallback sull'inserimento ... Quindi è possibile accedere utilizzando la ragione l'argomento CacheItemRemovedReason.È possibile quindi accedere alla ragione come uno dei quattro motivi elencati:

  1. Rimosso L'elemento viene rimosso dalla cache da una chiamata metodo Remove o con un metodo chiamata Insert che ha specificato la stessa chiave.
  2. Scaduto L'elemento viene rimosso dalla cache perché è scaduto.
  3. Sottoutilizzato L'elemento viene rimosso dalla cache perché il sistema lo ha rimosso per liberare memoria.
  4. DependencyChanged L'elemento viene rimosso dalla cache perché la dipendenza della cache associata è cambiata.

In genere, i motivi per cose che non hanno esplicito sono Scaduti e Sottoutilizzati. Rimuovi le chiamate effettuate sulla cache e non hanno dipendenze.

Probabilmente scoprirai, mentre ripercorrerai queste cose divertenti, che i tuoi articoli non sono scaduti o sottoutilizzati. Piuttosto, sospetto che scoprirai che AppDomain si sta scaricando.

Un modo in cui ciò può accadere a causa del cambio dei file web.config (o directory bin, o .aspx, ecc.). Per ulteriori informazioni su quando ciò si verifica, vedere la sezione Riavvia di this page. Quando ciò accade, le richieste attualmente in sospeso vengono prosciugate, la cache svuotata e AppDomain scaricato. È possibile rilevare questa situazione controllando lo AppDomain.IsFinalizingForUnload e registrando ciò durante la richiamata.

Un altro motivo per il riciclo di AppDomain è quando IIS decide di riciclare l'AppPool per uno dei motivi per cui è stato configurato. Esempi di che sono xxx memoria è stata allocata nel corso della vita, yyy secondi di autonomia per AppPool, TTT previsto tempo di riciclo o iiii tempo di inattività (nessun richieste in ingresso). Per ulteriori dettagli, verificare this article for IIS6 o this article for IIS7

+0

Ho avuto questo problema e non ho potuto ottenere iis express per fermare il riavvio dell'applicazione, stranamente questo era solo un problema per i progetti mvc. Ho aggiornato a Iis completo e il problema è andato via. – Jimmy

+1

Ottima risposta e un ottimo username! – theycallmemorty

1

Controllare il tempo di riciclo nel pool di applicazioni.

4

I documenti http://msdn.microsoft.com/en-us/library/4y13wyk9.aspx indicano che Cache.NoSlidingExpiration deve essere utilizzato se si utilizza una scadenza assoluta.

HttpRuntime.Cache.Insert(CacheName, Price, null, DateTime.Now.AddDays(3), Cache.NoSlidingExpiration); 

questo potrebbe non essere il problema, però, ho appena scoperto che Cache.NoSlidingExpiration dovrebbe essere la stessa di TimeSpan.Zero.

Successivamente vorrei controllare che il pool di applicazioni non scada e controllare la quantità di cache che si sta utilizzando. Se si tratta di un sito ad alto traffico che utilizza molta memoria (ad es. Memoria cache), scadranno gli elementi della cache poiché la memoria è necessaria per altre cose.

controlla anche l'ultimo commento qui http://bytes.com/topic/net/answers/717129-c-asp-net-page-cache-getting-removed-too-soon qualcuno sembra aver trovato una soluzione al tuo problema.

+0

Questo mi ha aiutato in una domanda non correlata. Grazie! – klkitchens

0

Per impostazione predefinita, gli elementi aggiunti alla cache non hanno una scadenza impostata, quindi questo è sicuramente qualcosa al di fuori della cache. Sono d'accordo con Josh, dovresti controllare il tempo di riciclo sul tuo App Pool.

Dai un'occhiata a questa pagina per vedere un esempio di come puoi aggiungere un delegato per farti sapere esattamente quando il tuo articolo viene rimosso dalla cache. Questo potrebbe aiutare nella risoluzione dei problemi, se non è il tuo App Pool:

http://msdn.microsoft.com/en-us/library/system.web.caching.cache.add.aspx

~ md5sum ~

5

L'oggetto Cache non garantisce che terrà su oggetti memorizzati nella cache a tutti, molto meno per la tempo pieno che suggerisci.

Se si desidera incoraggiarlo più fortemente a farlo, è possibile impostare CacheItemPriority.High o CacheItemPriority.NotRemovable quando si inserisce un elemento nella cache. Con la priorità Normal di default, il runtime ha una politica piuttosto aggressiva di lasciar andare gli oggetti quando la pressione della memoria aumenta.

Inoltre, per impostazione predefinita, l'AppPool IIS verrà riciclato una volta al giorno o così, che cancellerà tutto nella cache.

Problemi correlati