2012-06-14 14 views
10

Ho un'app ASP.NET MVC 3 che è fondamentalmente solo un insieme di servizi Web. Questi servizi Web sono esposti da una serie di azioni Controller. Ogni azione del controller interroga il mio database. Poiché i miei dati cambiano raramente e i dati obsoleti non sono un problema, ho pensato di implementare un po 'di cache per migliorare le prestazioni. I miei obiettivi sono:Dati di memorizzazione nella cache in ASP.NET MVC 3

  1. Non memorizzare nella cache una risposta a un utente.
  2. Memorizza nella cache i record del database per un massimo di 24 ore. Se sono trascorse 24 ore, colpire nuovamente il database.

Ha senso? So come prevenire la risposta dal caching. Mi basta usare il seguente:

HttpContext.Response.Cache.SetCacheability(cacheability) 

Tuttavia, non sono sicuro come memorizzare nella cache i miei record del database in memoria per un massimo di 24 ore. Qualcuno ha qualche suggerimento su come farlo? Non sono nemmeno sicuro di dove guardare.

Grazie

+0

Si desidera semplicemente memorizzare nella cache l'intero contenuto di una tabella in memoria oppure si desidera memorizzare nella cache una parte utilizzando una cache LRU? – hatchet

+1

Non sembra che tu stia cercando una soluzione fornita dal framework MVC. Il framework MVC è progettato per creare risposte per un utente e può memorizzare nella cache tali risposte utilizzando l'attributo OutputCache incorporato. Dato che non vuoi che le risposte vengano memorizzate nella cache, potresti voler cercare un metodo più astratto per memorizzare nella cache i risultati delle query che non sono legati al framework MVC (memcached, ecc.). – ken

+0

Voglio memorizzare nella cache l'intero contenuto di una tabella. In realtà, nella mia instace, la mia tabella è già stata convertita in oggetti CLR. Quindi, idealmente, vorrei solo mettere in cache gli oggetti. – user70192

risposta

0

Here è un buon articolo che discute diverse pratiche relative prestazioni per ASP.NET MVC 3 e il caching è menzionato.

2

Il framework MVC è indipendente dalla persistenza. Non esistono mezzi integrati per archiviare i dati, quindi non esistono mezzi integrati per memorizzare nella cache i dati memorizzati.

L'attributo OutputCache può essere utilizzato per memorizzare nella cache una risposta del server. Ma hai esplicitamente affermato che non è qualcosa che vuoi fare.

Tuttavia, è ancora possibile utilizzare lo OutputCache integrato se si desidera rimanere all'interno del framework MVC. Considerate esponendo i dati che si desidera memorizzare nella cache come risultato JSON

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

La stringa JSON in /ControllerName/GetMyData verrà memorizzata nella cache per 24 ore, quindi la query effettiva verrà corse solo una volta al giorno. Ciò significa che dovrai implementare una chiamata AJAX sulla tua pagina finale o effettuare un'altra chiamata HTTP dal tuo server. Nessuno di questi è l'ideale.

Vorrei cercare un'altra soluzione al problema al di fuori del framework MVC. Si consideri memcached, che è stato creato esattamente per questo scopo.

1

Se si utilizza MSSQL si consiglia di guardare SQL Cache Dependency.

Non sono sicuro se è possibile configurare la scadenza della cache su 24 ore ma con la dipendenza della cache che potrebbe non essere necessario - invalida la cache non appena vi è un aggiornamento nel database (cioè dovrebbe essere più efficiente rispetto alla strategia di scadenza del tempo).

2

Quello di cui stai parlando non è esattamente responsabilità di MVC. ASP.Net ti consente di concentrarti solo sulle cose che produce (e questo sono le risposte, ovviamente).

Se si desidera memorizzare nella cache i dati, è preferibile inserirlo nella stessa posizione in cui è stato prodotto, da qualche parte in BL o Data Layer.

si può fare qualcosa di simile:

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 i dati effettivi qui. Dopo aver aggiunto questa classe, sostituire i metodi GetData() con DataCacher.Data.

Spero che ti aiuti o almeno ti induca a riflettere ulteriormente.

8

È possibile utilizzare lo spazio dei nomi System.Runtime.Caching (o la cache ASP.NET, ma questo è più vecchio e può essere utilizzato solo all'interno delle applicazioni Web).

Ecco una funzione di esempio che è possibile utilizzare per avvolgere il meccanismo di recupero dei dati corrente. Puoi modificare i parametri in MemoryCache.Add per controllare quanto è memorizzato nella cache, ma hai richiesto 24 ore in alto.

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; 
} 

Come menzionato da @Bond, si può anche voler guardare utilizzando una cache Dipendenza SQL se i dati sono in caching è destinata a cambiare entro le 24 ore. Se è abbastanza statico, questo farà ciò che hai chiesto.

+0

Essendo per lo più bloccato su .NET 3.5, non ne avevo mai sentito parlare. È bello - un po 'come un memcached pronto all'uso. È distribuibile su più macchine? – ken

+0

Non è su più macchine, è solo una soluzione in memoria. È esattamente uguale alla cache ASP.NET ('System.Web.Caching') ma è disponibile anche per le applicazioni non-ASP.NET. – Richard

Problemi correlati