2009-07-07 9 views
9

Deseo agregar permanentemente un elemento a la memoria caché. Estoy usando la siguiente sintaxis:Cómo evitar que ASP.NET elimine elementos de la memoria caché

HttpContext.Current.Cache.Insert(cacheName, c, null, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration); 

he descubierto, que ASP.NET todavía a veces elimina los elementos de la caché.

Cualquier ideas sobre cómo evitar que esto (además de dejar caer el caché y el uso de diccionario almacenado en un miembro estático?

Matra

+0

¿qué desea almacenar? –

+0

¿Qué tan grande/complejo es un artículo? o son estos solo ajustes? – BigBlondeViking

Respuesta

1

Mi respuesta no es correcta. Por favor, see here para una respuesta correcta.


No se puede evitar que ASP.NET elimine elementos del caché (por ejemplo, cuando la memoria baja).

Si necesita almacenar datos durante todo el tiempo de vida de la aplicación, luego ponerlo en la colección ApplicationState, por ejemplo:

Application["myData"] = ...; 

Esto es similar a la colección SessionState, pero como su nombre lo dice, es en toda la aplicación.

+2

Incorrecto. Ver la respuesta del usuario134706 a continuación. –

+0

Lamentablemente no puedo eliminar mi respuesta (probablemente porque es la respuesta aceptada) – M4N

1

Si quieres algo almacena en la memoria permanente (es decir, para la vida de el dominio de aplicación), entonces un campo estático (en su caso, un Dictionary<TKey,TValue>) es su mejor apuesta.

una vez que el CLR ha cargado el tipo que contiene en la memoria de su Dictionary se llevará a cabo en memoria hasta que se descarga el dominio de aplicación.

1

Nunca se puede evitar completamente que algo se elimine de la caché ASP.NET (es decir, el objeto HttpContext.Current.Cache) y esto es mucho por diseño.

Consulte la sección en el artículo ASP.NET Caching Overview de MSDN llamada "Eliminación automática de datos", que proporciona la información más pertinente sobre los elementos que se eliminan del caché.

Afirma:

ASP.NET puede eliminar los datos de la memoria caché para una de estas razones:

  • Porque la memoria en el servidor es bajo, un proceso conocido como barrido.
  • Porque el elemento en la caché ha caducado.
  • Porque la dependencia del elemento cambia.

Para ayudarlo a administrar los elementos almacenados en caché, ASP.NET puede notificar a su aplicación cuando se eliminan los elementos del caché.

Recolectar es el proceso de eliminar elementos de la memoria caché cuando la memoria es escasa. Los elementos se eliminan cuando no se ha accedido a ellos en algún momento o cuando los elementos se marcan como de baja prioridad cuando se agregan a la memoria caché. ASP.NET utiliza el objeto CacheItemPriority para determinar qué elementos buscar primero. Para obtener más información, consulte Cómo agregar elementos al caché.

Es por esta razón (Hurgar en la basura, si no hay otro) que nunca se puede confiar absolutamente en un elemento que puede haber colocado previamente en la memoria caché y marcado explícitamente con NoSlidingExpiration y NoAbsoluteExpiration, y posiblemente incluso marcada como un elemento de alta prioridad, ya que aún está allí en el Caché en un momento posterior.

0

Debe estar preparado para manejar una falta de caché y volver a cargar la información en su caché, según sea necesario. Consulte here

4

Utilice Cache.Add() y establezca la prioridad de caché extremadamente alta (CacheItemPriority.NotRemovable), esto le ayudará a permanecer en la caché.

HttpContext.Current.Cache.Add("key", "your object", null, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable, null); 

System.Web.Caching.CacheItemPriority.NotRemovable

Esto todavía parece no garantiza que sea en la memoria caché, pero también lo pone tan alto su muy poco probable que sea ... pero todavía tendrá que comprobar si su allí y volver a caché si no ... (parece que a algunas personas en el intertubes no les gusta usar esta configuración de caché alta ... y algunos lo hacen ... depende de su escenario exacto, supongo ...)

buena suerte

21

No se puede evitar que ASP.NET elimine elementos de la memoria caché (p. cuando la memoria baja).

No se puede prevenir por completo alguna vez algo de ser eliminado de la caché de ASP.NET (es decir, el objeto HttpContext.Current.Cache) y esto es en gran medida por el diseño.

¡Error! PUEDE evitar que sus elementos se eliminen de la memoria caché asp.net si marca el elemento con CacheItemPriority.NotRemovable. Todos y cada uno de los demás datos en caché (aplicación, sesión, etc.) se almacenan en el caché HttpRuntime de esta manera.

Las personas siempre tienden a creer que incluso esta prioridad no impide que sus datos caduquen, pero esto se debe a la falta de documentación adecuada. Creo que la confusión viene con la capacidad de eliminar manualmente un elemento de la memoria caché O el elemento que se elimina debido a las dependencias establecidas para ello.

Por lo tanto, si nunca lo elimina manualmente, y nunca especifica las dependencias que pueden eliminarlo, tiene su elemento allí durante la vigencia del dominio de la aplicación.

+0

Runtime, ¿Lo has probado? La respuesta de BigBlondeViking indica que este tipo de elementos aún pueden eliminarse. –

+0

Matra, sí, lo he probado.La confusión viene con la capacidad de eliminar manualmente un elemento con dicha prioridad, y también puede eliminarlo automáticamente especificando algún tiempo de caducidad o alguna dependencia. Por lo tanto, NotRemovable NO significa que una vez que lo guarde en caché, TIENE que permanecer allí durante la vigencia del dominio de aplicación. NotRemovable significa que la implementación de ms no eliminará dicho elemento cuando tenga poca memoria. Así es como el estado de la sesión de proceso se mantiene en caché. Si todos sus artículos no son extraíbles y almacena en caché su capacidad de memoria, obtendrá OutOfMemory. – user134706

0

tratar de combinar con la opción CacheItemPriority.NotRemovable:

<system.web> 
    <caching> 
     <cache disableExpiration="true"/> 
    </caching> 
    .... 
</system.web> 

Este debe anular la configuración Machine.config.

+0

Debe hacer una respuesta clara en la sección de respuestas, esto parece más como otra pregunta –

Cuestiones relacionadas