2013-05-01 15 views
5

Sto usando MemoryCache per memorizzare coppie chiave/valore nella mia applicazione MVC .Net.C# MemoryCache per 2 diversi tipi di chiavi?

Ci sono 2 scopi principali che sto usando MemoryCache. Uno è quello di memorizzare le sessioni per gli ID utente, e un altro è quello di memorizzare le costanti (questo è solo un esempio) Le chiavi potrebbero teoricamente essere le stesse in entrambi i casi, quindi voglio separarle 2.

Sto pensando di 2 o 3 modi. Qual è il modo migliore? O c'è un'alternativa migliore?

  1. Ogni chiave nella cache che viene inserito da un namespace.

    "user_session: 1", "user_session: 2"
    "costanti: 1", "costanti: 2"

  2. Uso dizionari nidificate come chiavi.

    Ci sarà una chiave "user_sessions" il cui valore sarà un dizionario che associa gli ID all'oggetto di sessione. Ci sarà una chiave "costanti" il cui valore sarà un dizionario.

  3. Ogni "spazio dei nomi" ottiene la propria istanza di MemoryCache.

Lo svantaggio con # 2 è che quando voglio ottenere il valore appartenente ad un ID utente, ho bisogno di ottenere prima il dizionario, quindi ottenere il valore per una chiave in quel dizionario. Il che significa che ho bisogno di memorizzare il dizionario in memoria.

IE:

Dictionary<string, string> userSessions = MemoryCache.Default["user_sessions"] 
object session = userSessions.get("1"); 
+0

Perché è necessario memorizzare le costanti in un dizionario? Non potresti semplicemente usare le costanti? – Kenneth

+0

@Kenneth stavo usando questo come esempio. La domanda continua: come utilizzare MemoryCache per 2 diversi tipi di chiavi? –

+0

Utilizzo 1. Non è necessario preoccuparsi di problemi di concorrenza con l'accesso al dizionario contenuto suggerito come opzione in 2. Questa risposta è utile: http://stackoverflow.com/a/13425322/112196 –

risposta

2

Go per l'opzione # 3!

  • Per il programmatore è più facile accedere.
  • E 'la soluzione più veloce (vedi commenti sulle altre soluzioni)
  • E' la soluzione più efficiente della memoria (vedi commenti sulle altre soluzioni)

Opzione # 2:

  • L'hai detto tu stesso.
  • Se la cache decide di rimuovere una chiave, viene rimosso un intero dizionario, con conseguente maggiore ricarica dei valori.

Opzione # 1:

  • Non c'è bisogno di concatinate stringa (prestazioni e memeory)
  • nomi più lunghi chiave producono più confrontare i tempi.
  • L'aggiunta di elementi sarà più lenta perché contiene il doppio delle chiavi.
+2

Vale la pena notare che il [docs] (http://msdn.microsoft.com/en-us/library/system.runtime.caching.memorycache.memorycache.aspx) evita di creare più istanze di 'MemoryCache' di quelle realmente necessarie. Non specificano il perché esattamente, ma qualcosa da tenere a mente. –

+1

Sì, lo so. È in corso un processo per rimuovere elementi obsoleti e scaduti. Questo processo richiederà sempre più tempo in quanto ci sono più cache, ma non è qualcosa di cui il programmatore deve preoccuparsi in questa fase, a meno che tutti i core non eseguano il 90%. –

1

Non sono sicuro di quale sia l'implementazione effettiva, ma sii cauto nell'utilizzare le sessioni in questo modo con il framework MVC. Gli identificatori degli utenti sono meglio lasciati nei cookie. Ad ogni modo, posso vedere gli usi per percorrere questa strada anche in occasione.

Eviterei di utilizzare i dizionari nella cache in questo modo. Non so che tipo di allocazione di memoria stai guardando ma potrebbe diventare davvero brutto se il server ha traffico elevato e più dizionari. Come menzionato sopra in un commento, dovresti anche preoccuparti dei problemi di concorrenza con i dizionari in questo modo.

L'approccio migliore dalle opzioni fornite è di assegnare a ogni spazio dei nomi la propria istanza della cache.