2010-01-15 13 views
7

Dopo aver creato un proof of concept per un sito ASP.NET MVC e aver verificato l'appropriata separazione dei problemi, ho notato che stavo effettuando molte costose chiamate di database ridondanti per informazioni sull'utente corrente.Memorizzazione nella cache dei dati utente per evitare spostamenti eccessivi del database

Essendo storicamente una persona di desktop e servizi, il mio primo pensiero è stato quello di memorizzare nella cache i risultati del db in alcuni static s. Non ci sono volute molte ricerche per vedere che fare ciò avrebbe mantenuto i dati dell'utente corrente sull'intero AppDomain per tutti gli utenti.

Successivamente ho pensato di utilizzare HttpContext.Current. Tuttavia, se metti elementi qui quando un utente viene disconnesso, quando accedono ai dati memorizzati nella cache non saranno aggiornati. Potrei aggiornarlo ogni volta che accedo al login/logout, ma non posso dire se questo sembra giusto. In assenza di altre idee, questo è il punto in cui mi sto appoggiando.

Che cos'è un modo leggero per memorizzare accuratamente i dettagli dell'utente ed evitare di dover effettuare tonnellate di chiamate al database?

+0

Che tipo di dati è necessario memorizzare? Se si tratta solo di poche proprietà semplici, ad es. String, Integer, è possibile archiviare semplicemente i cookie dei moduli. – willbt

risposta

5

Se le informazioni che si desidera cache è per utente e solo quando sono attivi, quindi Session è il diritto posto.
http://msdn.microsoft.com/en-us/library/system.web.sessionstate.httpsessionstate.aspx

+0

Ecco un altro post che funziona in cima alla sessione: http://stackoverflow.com/questions/343899/ – Dinah

+0

La sessione è in realtà per sessione del browser. È possibile accedere come utente diverso utilizzando lo stesso browser e lo stato della sessione restituito sarà lo stesso del precedente utente. – Appetere

+0

@Steve se questo è il caso, l'applicazione non sta gestendo correttamente il log on/off. – AUSteve

2

Quello che stai cercando è System.Web.Caching.Cache

http://msdn.microsoft.com/en-us/library/system.web.caching.cache.aspx

+5

Per citare MSDN "Un'istanza di questa classe viene creata per dominio dell'applicazione" che non è ciò che l'OP voleva. – AUSteve

+1

Sto usando HttpContext.Current.Cache per archiviare IPrincipal con FormsAuthentication. Sessione significa un altro cookie e ulteriori problemi. – LukLed

+1

Sono ben consapevole del fatto che viene creata un'istanza per AppDomain, ma che cosa è sbagliato nell'aggiungere e recuperare dalla cache con una chiave univoca per l'utente. per esempio. Utente-1 dove 1 è l'ID dell'utente? Risolve ancora il problema IMO. – willbt

2

ASP.NET gestione dello stato sessione è buona per alcune situazioni, ma quando il carico pesante è messo, si tende a creare colli di bottiglia nelle prestazioni ASP.NET. Per saperne di più su di esso qui:

http://msdn.microsoft.com/en-us/magazine/dd942840.aspx

http://esj.com/articles/2009/03/17/optimize-scalability-asp-net.aspx

La soluzione per evitare colli di bottiglia è l'uso di caching distribuito. Esistono molte soluzioni di caching distribuite gratuite sul mercato come Memcached o NCache Express.

Non so molto di Memcached ma ho utilizzato NCache Express di Alachisoft, consente di utilizzare il caching di ASP.NET senza richiedere alcuna modifica del codice.

Problemi correlati