232 votos

Cómo almacenar en caché los datos en una aplicación MVC

He leído un montón de información acerca de la caché de páginas y parcial de la página de la caché de una aplicación MVC. Sin embargo, me gustaría saber cómo habría que hacer caché de datos.

En mi escenario voy a estar usando LINQ to entities (entity framework). En la primera llamada a GetNames (o cualquiera sea el método que sea) que me quieren agarrar los datos de la base de datos. Quiero guardar los resultados en caché y en la segunda convocatoria para utilizar la versión almacenada en caché, si es que existe.

¿Puede alguien mostrar un ejemplo de cómo funcionaría, donde esta debe ser implementada (modelo?) y si iba a funcionar.

Yo he visto a este hecho en el tradicional ASP.NET aplicaciones , normalmente, por muy de datos estáticos.

374voto

Hrvoje Puntos 4248

Aquí hay buen servicio de caché que utilizo:

public class InMemoryCache: ICacheService
{
    public T Get<T>(string cacheID, Func<T> getItemCallback) where T : class
    {
        T item = HttpRuntime.Cache.Get(cacheID) as T;
        if (item == null)
        {
            item = getItemCallback();
            HttpContext.Current.Cache.Insert(cacheID,item);
        }
        return item;
    }
}

interface ICacheService
{
    T Get<T>(string cacheID, Func<T> getItemCallback) where T : class;
}

Uso:

cacheProvider.Get("cache id", (delegate method if cache is empty));

Proveedor de caché comprobará si hay algo con el nombre de "id de caché" en la memoria caché, y si no hay, llamará un método delegado para recoger datos y almacenarlo en la memoria caché.

Ejemplo:

var products=cacheService.Get("catalog.products", ()=>productRepository.GetAll())

72voto

terjetyl Puntos 4969

Referencia a la dll de System.Web en su modelo y usar System.Web.Caching.Cache

public string[] GetNames()
{
  if(Cache["names"] == null)
  {
    var names = DB.GetNames();
    Cache["names"] = names;
  }
  return names;
}

Simplificado un poco, pero supongo que funcionaría. Esto no es específico de MVC y siempre he utilizado este método para el almacenamiento en caché de datos.

41voto

Oli Puntos 892

Me estoy refiriendo a TT post y sugieren el siguiente enfoque:

Referencia de la System.Web archivo dll en su modelo y uso System.Web.Caching.Cache

public string[] GetNames()
{ 
    var noms = Cache["names"];
    if(noms == null) 
    {    
        noms = DB.GetNames();
        Cache["names"] = noms; 
    }

    return ((string[])noms);
}

Usted no debe devolver un valor de una re-lectura de la memoria caché, ya que nunca se sabe si en ese momento aún está en la memoria caché. Incluso si usted inserta en la declaración anterior, es posible que ya se ha ido o nunca ha sido añadido a la caché - que usted no sabe.

Para agregar los datos leídos de la base de datos y devolver directamente, y no a la re-lectura de la memoria caché.

24voto

Brendan Enrick Puntos 2892

Steve Smith hizo dos grandes entradas de blog que demuestran cómo el uso de su CachedRepository patrón en ASP.NET MVC. Se utiliza el modelo de repositorio de forma efectiva y le permite obtener almacenamiento en caché sin tener que cambiar el código existente.

http://stevesmithblog.com/blog/introducing-the-cachedrepository-pattern/

http://stevesmithblog.com/blog/building-a-cachedrepository-via-strategy-pattern/

En estos dos posts él se muestra cómo configurar este patrón, y también explica por qué es útil. Usando este patrón de obtener almacenamiento en caché sin su código existente de ver cualquiera de la caché de la lógica. Esencialmente se utiliza la caché del repositorio como si se tratara de cualquier otro repositorio.

4voto

Arun Duth Puntos 41

AppFabric caché se distribuye y en una memoria técnica que almacena datos en pares de clave y valor usando memoria física a través de múltiples servidores de caché. AppFabric proporciona un rendimiento y mejoras de escalabilidad para aplicaciones de .NET Framework. Conceptos y arquitectura

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X