2012-06-11 6 views
8

Para ser sucinto, ¿qué caches en memoria SIMPLE existen en el ecosistema .Net?. Cachés simples en memoria .Net

Lo que estoy buscando es:

  • n-configuración (que no sean simples llamadas a la API). No quiero meterme con los archivos de configuración externos porque complican la implementación.
  • Mismo proceso (no un proceso externo o servidor). Preferiblemente crean tan fácilmente como
    var myCache = new SimpleCache(1024 * 1024 * 100); // 100 MB
  • límite de memoria especificado
  • Los productos que borran de la memoria caché basada en menos uso
  • basada en el tiempo de expiración (no es necesario, pero hace que sea potencialmente útil en otros escenarios)
  • Funciona con .Net 3,5

que ya han reasearched estas opciones:

  • ASP.Net System.Web.Caching
    • su API no admite ningún tipo de control sobre el tamaño de la memoria caché, ni prioridad en función del uso. En consecuencia, está totalmente a su merced en cuanto a cuándo decide que hay suficiente presión de memoria para vaciar el caché.
  • System.Runtime.Caching
  • Microsoft Enterprise Library - Bloque de almacenamiento en caché
    • Aparte de tener una reputación de peso pesado, no me gusta su configuración con archivos XML o app.config. Además, aunque admite limitar el tamaño de la memoria caché en función del NÚMERO de objetos almacenados, no tiene mecanismos para limitar el TAMAÑO de esos objetos.
  • NCache
    • algo excesivo para el caso de uso que quiero, pero lo más importante es que es un producto de pago que no es algo que quiero hacer trato con (en comparación conmigo sólo escribir uno en un día o dos). Como de costumbre, su edición expresa tiene limitaciones de uso que desalientan su uso para cualquier propósito de producción.
  • MemCached
    • exactamente lo contrario de lo que yo quiero (proceso distribuido externa)

estoy trabajando con Google Protocol Buffers (protobuf-net), por lo que tienen una estimación relativamente precisa de la huella de memoria de cada artículo. Estoy almacenando en caché los datos devueltos por el acceso a la base de datos, pero no deseo utilizar un ORM formal (en realidad estoy usando PetaPoco, pero eso no viene al caso).

En esta etapa, planeo implementar mi propia memoria caché, utilizando una lista de doble enlace y hash (diccionario) para proporcionar elementos que se utilizan menos recientemente desde la memoria caché una vez que se alcanza el límite de la memoria caché. Sin embargo, quería verificar si alguien sabía de alguna opción adecuada antes de poner mi propia cuenta.

+1

Esto nunca es simple, una memoria caché sin una buena política de caducidad es una pérdida de memoria. No me gusta lo que está disponible siempre es la motivación número uno para construir el tuyo. –

+0

En lugar de una política de caducidad, deseo especificar la cantidad máxima de memoria que debería ocupar. Realmente no se puede medir la cantidad de memoria que están ocupando los objetos en .Net, pero los buffers de protocolo que estoy usando tienen una medida razonablemente útil. –

+0

Si desarrolla esto para que sea un caché bastante genérico, ¿entonces quizás podría ponerlo en CodeProject o similar, para que otros lo usen? Debería ser bastante sencillo obtener un prototipo simple y ser muy simple para obtener una cobertura de prueba alta. – Michael

Respuesta

1

¿Qué ocurre con las características de caché en AppFabric para Windows Server? Darle una oportunidad ! http://msdn.microsoft.com/en-us/windowsserver/ee695849.aspx y http://msdn.microsoft.com/en-us/library/hh334364.aspx

Pero si no hay productos en el mercado que proporcionen el comportamiento deseado, deberá implementar su propia capa de almacenamiento en caché personalizada mediante Patrones de diseño.

+0

buen concepto, ¡ya me encanta! +1! –

+0

Es agradable ver una opción que aún no había considerado, y también es agradable que, aunque parezca estar orientada a la configuración XML, tenga opciones de configuración programática equivalentes. Sin embargo, no es lo que estoy buscando, ya que parece que no proporciona capacidades para limitar el uso de la memoria. Limitar un caché por recuento de objetos es bastante inútil porque esos objetos podrían ser la raíz del árbol que consume 1 KB cada uno o 1 GB cada uno. –

1

Es bastante antiguo, pero se asemeja a lo que está hablando

Generic cache with memory consumption

y aquí es otro SO con un escenario relevante:

performance of system runtime caches

+0

+1 porque este es en realidad el artículo que leí hace dos meses que proporcionó la base para diseñar el mío. No he revisado el código fuente completo, pero el artículo fue un buen punto de partida. –

3

Así lo acabaste haciendo el caché?

Tengo un prototipo de caché universal en el que estaba trabajando que hace más o menos lo que desea excepto el límite de caché por capacidad (número de elementos) en lugar de uso de memoria, pero tiene una característica adicional que puede apreciar: persistencia local.

El caché está estructurado por capas donde se puede tener una sola capa: de memoria, una doble capa: Memoria + persistencia local o una triple capa: la memoria + + persistencia local de uso compartido de red. Puede usar cualquier combinación de capas que necesite. Aunque el uso compartido de red que está diseñado como un servicio .Net remoto que puede instalarse en cualquier computadora de la red y es autodescubrible por cachés de clientes aún no es del todo funcional.

Las cachés son clases genéricas a las que se accede a través de una interfaz ICache < TKey, TValue >. La memoria caché local persistente utiliza SQL Express Compact 4 para crear bases de datos y tablas sobre la marcha que tengan todos los campos de su TKey, una marca de tiempo y un TValue serializado como una columna de Imagen. En caso de configuración de capa múltiple, cuando usa el método TryGetValue (tecla TKey, valor de TValue) en la memoria caché de nivel superior, si la primera capa (caché de memoria) no tiene el elemento revisa internamente con la siguiente capa (local persistente), luego el siguiente ... hasta que no haya más caché disponibles para proporcionar los datos. Cuando el caché de memoria descarta un elemento, permite que el siguiente caché tenga la oportunidad de agregar el elemento a su capa, por lo que en caso de caché persistente, los datos se almacenan para futuras solicitudes.

Los cachés tienen un parámetro de tiempo de retención uso definidos (es decir, unos pocos minutos para una memoria caché, 30 días para caché persistente local) y capacidad.

que pueden publicar como código de dominio público si alguien está interesado.

+2

Debe publicar el código que menciona aquí. –

Cuestiones relacionadas