2012-06-14 15 views
10

Tengo una aplicación ASP.NET MVC 3 que básicamente es solo un conjunto de servicios web. Estos servicios web están expuestos por un conjunto de acciones del Controlador. Cada acción del controlador consulta mi base de datos. Debido a que mis datos rara vez cambian, y los datos obsoletos no son una preocupación, pensé que implementaría algo de caché para mejorar el rendimiento. Mis objetivos son:Almacenamiento de datos en caché en ASP.NET MVC 3

  1. Nunca almacenar en caché una respuesta a un usuario.
  2. Almacena en caché los registros de la base de datos por hasta 24 horas. Si han pasado 24 horas, vuelva a la base de datos.

¿Tiene sentido? Sé cómo evitar la respuesta del almacenamiento en caché. Sólo tiene que utilizar el siguiente:

HttpContext.Response.Cache.SetCacheability(cacheability) 

Sin embargo, no estoy seguro de cómo almacenar en caché mis registros de base de datos en la memoria para un máximo de 24 horas. ¿Alguien tiene alguna sugerencia sobre cómo hacer esto? Ni siquiera estoy seguro de dónde mirar.

Gracias

+0

¿Simplemente desea almacenar en caché todo el contenido de una tabla en la memoria, o desea almacenar en caché una parte utilizando una memoria caché LRU? – hatchet

+1

No parece que estés buscando una solución provista por el framework MVC. El marco MVC está diseñado para crear respuestas para un usuario, y puede almacenar en caché esas respuestas utilizando el atributo integrado OutputCache. Dado que no desea que las respuestas se almacenen en la memoria caché, es posible que desee buscar un método más abstracto de almacenamiento en caché de los resultados de la consulta que no esté vinculado al marco MVC (memcached, etc.). – ken

+0

Quiero almacenar en caché todo el contenido de una tabla en la memoria. En realidad, en mi instancia, mi tabla ya se ha convertido en objetos CLR. Entonces, idealmente, me gustaría almacenar en caché los objetos. – user70192

Respuesta

0

Here es un buen artículo que discute varias prácticas relacionadas rendimiento para ASP.NET MVC 3 y el almacenamiento en caché se menciona.

2

El marco MVC es persistente-agnóstico. No hay medios incorporados para almacenar datos, por lo que no hay medios incorporados para almacenar en caché los datos almacenados.

El atributo OutputCache se puede utilizar para almacenar en caché una respuesta del servidor. Pero usted declaró explícitamente que eso no es algo que quiera hacer.

Sin embargo, aún puede utilizar el OutputCache incorporado si desea permanecer dentro del marco de MVC. Considere la exposición de los datos que desea almacenar en caché como resultado JSON

[OutputCache(Duration = 86400)] 
public JsonResult GetMyData() { 
    var results = QueryResults(); 
    return Json(results); 
} 

La cadena JSON en /ControllerName/GetMyData se almacenan en caché durante 24 horas, por lo que la consulta real sólo se corrió una vez al día. Eso significa que debe implementar una llamada AJAX en su página final o realizar otra llamada HTTP desde su servidor. Ninguno de esos son ideales.

Buscaría otra solución a su problema fuera del marco de MVC. Considere memcached, que fue creado para este propósito.

1

Si está utilizando MSSQL es posible que desee consultar SQL Cache Dependency.

No estoy seguro si puede configurar la caché expirada a 24 horas pero con la dependencia de caché no es necesario - invalidará la caché tan pronto como haya una actualización en la base de datos (es decir, debería ser más eficiente que la estrategia de expiración de tiempo).

2

De lo que estás hablando no es exactamente la responsabilidad de MVC. ASP.Net le permite elegir solo las cosas que produce (y esto responde, obviosly).

Si desea almacenar en caché los datos, puede ser mejor colocarlos en el mismo lugar donde se produjeron, en algún lugar de BL o de capa de datos.

Usted puede hacer algo así:

public class DataCacher 
{ 
    private static String data; 
    private static DateTime updateTime; 

    private DataCacher() { } 

    public static String Data 
    { 
     get 
     { 
      if (data == null || updateTime > DateTime.Now) 
      { 
       data = "Insert method that requests your data form DB here: GetData()"; 
       updateTime = DateTime.Now.AddDays(1); 
      } 
      return data; 
     } 
    } 
} 

String data presenta los datos reales aquí. Después de agregar esta clase, reemplace sus métodos GetData() con DataCacher.Data.

Espero que ayude o al menos te lleve a pensar un poco más.

8

Puede usar el espacio de nombre System.Runtime.Caching (o la memoria caché ASP.NET, pero esto es anterior y solo se puede usar en aplicaciones web).

Aquí hay una función de muestra que puede utilizar para ajustar su mecanismo actual de recuperación de datos. Puede modificar los parámetros en MemoryCache.Add para controlar cuánto se almacenan en caché, pero solicitó 24 horas antes.

using System.Runtime.Caching; // At top of file 

public IEnumerable<MyDataObject> GetData() 
{ 
    IEnumerable<MyDataObject> data = MemoryCache.Default.Get(MYCACHEKEY) as IEnumerable<MyDataObject>; 
    if (data == null) 
    { 
     data = // actually get your data from the database here 
     MemoryCache.Default.Add(MYCACHEKEY, data, DateTimeOffset.Now.AddHours(24)); 
    } 
    return data; 
} 

Como se ha mencionado por @Bond, también puede que desee ver en el uso de una caché de dependencias SQL si el almacenamiento en caché de datos que está es probable que cambie dentro de las 24 horas. Sin embargo, si es bastante estático, hará lo que usted solicitó.

+0

Siendo principalmente atrapado en .NET 3.5, no había oído hablar de esto. Se ve bien - algo así como un memcached fuera de la caja. ¿Es distribuible en múltiples máquinas? – ken

+0

No se trata de varias máquinas, es solo una solución en la memoria. Es exactamente lo mismo que el caché de ASP.NET ('System.Web.Caching') pero también está disponible para aplicaciones que no sean de ASP.NET. – Richard

Cuestiones relacionadas