2009-11-24 7 views
12

Estoy intentando almacenar en caché un valor de precio utilizando HttpRuntime.Cache.Insert(), pero solo aparece para mantener el valor durante un par de horas o algo antes de borrarlo . ¿Qué estoy haciendo mal? Quiero que el valor permanezca en caché durante 3 días.C# HttpRuntime.Cache.Insert() No mantiene el valor en caché

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

¿Cómo verifica que se ha eliminado? –

+0

@ J.W. : Caché [CacheName] será nulo si la entrada ha sido eliminada/expirada. – RickNZ

Respuesta

31

Respuesta corta

Su grupo de aplicaciones o sitio web está siendo apagado demasiado pronto. Extienda el tiempo de inactividad en el sitio, amplíe la vida útil del grupo de aplicaciones para el grupo que ejecuta el sitio. Aumente la asignación de memoria y solicite límites.

respuesta completa

Si desea saber cuándo y por qué algo se va a quitar de la caché, tienes que entrar la eliminación elemento utilizando la opción CacheItemRemovedCallback en la inserción ... A continuación, puede iniciar sesión utilizando la razón el argumento CacheItemRemovedReason.De este modo puede registrar la razón como uno de los cuatro motivos enumerados:

  1. Eliminado El elemento se elimina de la memoria caché por una llamada de método Remove o por una llamada a un método de inserción que especifica la misma clave.
  2. caducado El elemento se elimina de la caché porque expiró.
  3. Underused El elemento se elimina de la memoria caché porque el sistema lo eliminó para liberar memoria.
  4. DependencyChanged El elemento se elimina de la memoria caché porque la dependencia de la caché asociada a ella cambió.

Normalmente, encontrará Expirado y Subutilizado los motivos de las cosas que no tienen explicto Eliminar las llamadas realizadas en la memoria caché y no tienen dependencias.

Es probable que descubras, mientras trazas estas cosas divertidas, que tus artículos no están vencidos ni subutilizados. Más bien, sospecho que encontrará que el AppDomain se está descargando.

Una forma en que esto puede suceder debido a que los archivos web.config (o el directorio bin, o .aspx, etc.) se modifican. Para obtener más información sobre cuándo ocurre esto, consulte la sección Reinicios de la aplicación de this page. Cuando eso ocurre, las solicitudes actualmente pendientes se agotan, el caché se vacía y el AppDomain se descarga. Puede detectar esta situación marcando AppDomain.IsFinalizingForUnload y registrando durante la devolución de llamada.

Otra razón para reciclar AppDomain es cuando IIS decide reciclar la AppPool por alguna de las razones por las que se ha configurado. Ejemplos de que se xxx memoria ha sido asignado durante la vida útil, yyy segundos de tiempo de ejecución para la AppPool, ttt programado tiempo de reciclado, o iiii tiempo de inactividad (no hay peticiones de entrada). Para obtener más información, consulte this article for IIS6 o this article for IIS7

+0

Tuve este problema y no pude conseguir que iis express dejara de reiniciar la aplicación, extrañamente esto era solo un problema para los proyectos de mvc. Me actualicé a iis completo y el problema desapareció. – Jimmy

+1

¡Gran respuesta y un gran nombre de usuario! – theycallmemorty

1

Compruebe el tiempo de reciclaje en su Pool de aplicaciones.

4

Los documentos http://msdn.microsoft.com/en-us/library/4y13wyk9.aspx indican que se debe utilizar Cache.NoSlidingExpiration si se utiliza una caducidad absoluta.

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

esto puede no ser su problema, sin embargo, acabo de encontrar que Cache.NoSlidingExpiration debe ser el mismo que TimeSpan.Zero.

A continuación verificaría que el grupo de aplicaciones no expire y verifique la cantidad de caché que está utilizando. Si se trata de un sitio de alto tráfico que usa mucha memoria (es decir, memoria caché), expirará los elementos de la memoria caché, ya que la memoria es necesaria para otras cosas.

también revise el último comentario aquí http://bytes.com/topic/net/answers/717129-c-asp-net-page-cache-getting-removed-too-soon Alguien parece haber encontrado una solución a su problema.

+0

Esto me ayudó en una pregunta no relacionada. ¡Gracias! – klkitchens

0

De manera predeterminada, los elementos agregados a la caché no tienen caducidad establecida, por lo que definitivamente es algo que está fuera de la caché. Estoy de acuerdo con Josh, debes verificar el tiempo de reciclaje en tu Pool de aplicaciones.

Consulte esta página para ver un ejemplo de cómo puede agregar un delegado para saber exactamente cuándo se va a eliminar su elemento de la memoria caché. Esto podría ayudar en la solución de problemas si no es tu grupo de aplicaciones:

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

~ md5sum ~

5

El objeto Cache no garantiza que va a aferrarse a los objetos almacenados en caché en absoluto, y mucho menos para el cantidad total de tiempo que sugieres

Si desea alentarlo más a que lo haga, puede establecer CacheItemPriority.High o CacheItemPriority.NotRemovable cuando inserta un elemento en la memoria caché. Con la prioridad Normal predeterminada, el tiempo de ejecución tiene una política bastante agresiva de soltar objetos cuando aumenta la presión de la memoria.

Además de eso, el AppPool de IIS se reciclará una vez/día más o menos, lo que borrará todo en la memoria caché.

Cuestiones relacionadas