È corretto utilizzare variabili statiche per memorizzare nella cache informazioni in ASP.net?

StackOverflow https://stackoverflow.com/questions/151021

Domanda

Al momento sto lavorando a un'applicazione di amministrazione del progetto in C # 3.5 su ASP.net. Per ridurre gli hit nel database, sto memorizzando molte informazioni nella cache utilizzando variabili statiche. Ad esempio, un elenco di utenti viene tenuto in memoria in una classe statica. La classe legge tutte le informazioni dal database all'avvio e aggiorna il database ogni volta che vengono apportate modifiche, ma non deve mai leggere dalla base di dati.

La classe esegue il ping di altri server web (se presenti) con informazioni aggiornate contemporaneamente a una scrittura nel database. Il meccanismo di ping è un servizio di Windows al quale l'oggetto cache viene registrato utilizzando una porta disponibile casuale. È usato anche per altre cose.

La quantità di dati non è poi così eccezionale. Al momento lo sto usando solo per memorizzare nella cache gli utenti (hash delle password, autorizzazioni, nome, e-mail, ecc.) Salva solo un mucchio di chiamate che vengono fatte al database.

Mi chiedevo se ci fossero insidie ??in questo metodo e / o se ci sono modi migliori per memorizzare nella cache i dati?

È stato utile?

Soluzione

Una trappola: un campo statico è definito per dominio di app e un carico maggiore farà sì che il server generi più domini di app nel pool. Questo non è necessariamente un problema se leggi solo dalla statistica, ma otterrai dati duplicati in memoria e otterrai un successo ogni volta che un dominio di un'app viene creato o riciclato.

Meglio usare l'oggetto Cache - è destinato a cose del genere.

Modifica: risulta che mi sono sbagliato su AppDomains (come sottolineato nei commenti) - più istanze di Applicazione verranno generate sotto carico, ma verranno tutte eseguite nello stesso AppDomain. (Ma dovresti comunque usare l'oggetto Cache!)

Altri suggerimenti

Finché ci si può aspettare che la cache non raggiungerà mai una dimensione superiore alla quantità di memoria disponibile, va bene. Inoltre, assicurati che ci sia una sola istanza di questa applicazione per database, o che le cache nelle diverse istanze dell'app potrebbero "non essere sincronizzate."

Dove lavoro, abbiamo un O / RM nostrano e facciamo qualcosa di simile a quello che stai facendo con alcune tabelle che non dovrebbero crescere o cambiare molto. Quindi, quello che stai facendo non è senza precedenti, e infatti nel nostro sistema, è provato e vero.

Un'altra trappola da considerare è la sicurezza del thread. Tutte le tue richieste di applicazione sono in esecuzione nello stesso AppDomain ma possono arrivare su thread diversi. L'accesso a una variabile statica deve tener conto dell'accesso da più thread. Probabilmente un po 'più sovraccarico di quello che stai cercando. L'oggetto cache è migliore per questo scopo.

Hmmm ... Il "classico" metodo sarebbe la cache dell'applicazione, ma a condizione che non si aggiorni mai le variabili statiche, o se si capiscano i problemi di blocco, e si capisce che possono scomparire in qualsiasi momento con un riavvio dell'appdomain, quindi non vedo davvero il danno nell'uso di un statico.

Ti suggerisco di esaminare i modi per disporre di una cache distribuita per la tua app. Puoi dare un'occhiata a NCache o indeXus.Net

Il motivo per cui l'ho suggerito è perché hai implementato il tuo modo ad hoc per aggiornare le informazioni che stai memorizzando nella cache. Le variabili / i riferimenti statici vanno bene ma non si aggiornano / aggiornano (quindi dovrai gestire l'invecchiamento da solo) e sembra che tu abbia una configurazione distribuita.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top