Recentemente l'ho passato anch'io. Considerando che una cache in memoria verrà elaborata in modo specifico (non condivisa tra più istanze di un sito Web o di un'app business nativa o più server) non c'è alcun vantaggio nell'avere più istanze MemoryCache
eccetto per motivi organizzativi del codice (che possono essere ottenuti in altri modi) .
La memoria cache deve essere utilizzata da sola principalmente a causa delle sue capacità di gestione della memoria. Oltre ai contatori delle prestazioni (che hanno un sovraccarico), MemoryCache è anche in grado di scadere gli elementi quando esaurisce la memoria allocata.
Se l'istanza corrente della cache supera il limite impostato memoria dalla proprietà CacheMemoryLimit, l'implementazione della cache rimuove voci della cache. Ogni istanza cache nell'applicazione può utilizzare la quantità di memoria specificata dalla proprietà CacheMemoryLimit.
da MemoryCache.CacheMemoryLimit Property
Utilizzando solo un'istanza del MemoryCache si può applicare questa gestione della memoria efficiente attraverso l'intera istanza dell'applicazione. Scadenza degli elementi meno importanti nell'intera applicazione. Ciò garantisce il massimo utilizzo della memoria, senza superare le capacità dell'hardware. Limitando l'ambito di ogni MemoryCache (come per un'istanza di una classe) non è più possibile gestire in modo efficace la memoria per l'applicazione (in quanto non può "vedere" tutto). Se tutte queste cache fossero "occupate", potrebbe essere più difficile gestire la memoria e non sarà mai così efficiente.
Questo è particolarmente sensibile nelle applicazioni che non hanno il lusso di un server dedicato.Immagina di eseguire la tua app su un server condiviso in cui ti è stata assegnata solo una memoria RAM da 150 MB (comune $ 10/mese di hosting a basso costo) che devi contare sulla tua cache per utilizzarla al massimo senza superarla. Se superi questa quantità di memoria, il tuo pool di app verrà riciclato e la tua app perde tutte le cache in memoria! (pratica comune di hosting a basso costo) Lo stesso potrebbe valere per un'applicazione non web ospitata in house su alcuni server aziendali condivisi. Allo stesso modo, ti viene detto di non intrattenere tutta la memoria su quella macchina e di coesistere pacificamente con qualche altra linea di app aziendali.
Questo limite di memoria, riciclo di app pool, perdita di cache è un comune "tallone d'Achille" per le app Web. Quando le app sono più affollate, si reimpostano più spesso a causa del superamento delle allocazioni di memoria, perdendo tutte le voci della cache e quindi facendo la maggior parte dei lavori di re-fetching che avrebbero dovuto essere memorizzati nella cache in primo luogo. Significa che l'app in realtà perde le prestazioni a carico massimo invece di guadagnare.
So che MemoryCache è la versione non web specifica dell'implementazione System.Web.Caching.Cache, ma questo illustra la logica dietro l'implementazione della cache. La stessa logica può essere applicata in un progetto non Web se non si dispone dell'utilizzo esclusivo dell'hardware. Ricorda che se la tua cache impone alla macchina di iniziare a fare swap con i pagefile, la tua cache non sarà più veloce della cache sul disco. Avrai sempre un limite da qualche parte, anche se quel limite è di 2 GB o qualcosa del genere.
Nel mio caso, dopo aver letto tutto ciò, sono passato a utilizzare una "memoria statica pubblica" nella mia app e ho semplicemente separato gli elementi della cache con le loro chiavi di cache. Ad esempio se si desidera memorizzare una cache per istanza si potrebbe avere una chiave di cache come qualcosa come "instance- {instanceId} -resourceName- {resourceId}". Consideralo come il nome che spazia tra le voci della cache.
Spero che questo aiuti!
Qual è la differenza tra una cache singola e molte cache? Dopotutto, faranno tutti la stessa cosa. – spender
Per uno, non dovrò più preoccuparmi delle collisioni tra chiavi. Inoltre, ritengo che sia più organizzato e più facile da eseguire il debug rispetto all'utilizzo di un oggetto che trattiene tutte le cache dell'applicazione. –
Significa che non dovresti creare molte cache che memorizzano nella cache la stessa cosa. È molto meglio memorizzare nella cache il più possibile da una cache centrale. Ma è perfettamente ok creare molte cache che fanno cache di cose diverse. –