Il mio team e io stiamo attualmente mantenendo un sistema di caching basato esclusivamente sulle chiavi. Da quello che ho letto stiamo cercando un sistema basato sulla strategia cache-aside. Dove abbiamo un sito web che parla con un servizio di riposo utilizzando httpclients. Questi client utilizzano una memoria cache che funziona in base a una chiave combinata. Quando viene chiamato un altro metodo che invaliderebbe un elemento della cache, dovremmo istruire manualmente il memorycache a rimuoverlo.
Lascia che ti spieghi con l'esempio.
MemoryCacheStore
= > oggetto memorizzato in un singleton per l'intera applicazione web (Asp.Net MVC)
Pseudo codice che spiega il caso:
public class CustomerRestClient {
private readonly IMemoryCacheStore _cacheStore;
private readonly User user;
public CustomerRestClient(IMemoryCacheStore cacheStore, User user){
_cacheStore = cacheStore;
_user = user;
}
public Customer Get(int id){
return _cacheStore.Get($"Customer-Get-{id}-{_user.Id}", TimeSpan.FromMinute(10), () => RestService.Get(id));
}
public Customer Update(Customer customer){
var newCustomer = RestService.Update(customer);
_cacheStore.InvalidateKey($"Customer-Get-{customer.id}-{_user.Id});
return newCustomer;
}
}
Il problema con questo approccio è che lo sviluppatore deve sapere quali chiavi invalidare ogni volta che un oggetto è cambiato. Stiamo pensando di provare a risolvere questo problema con una sorta di cachekeymanager per eliminare la magia della stringa chiave, ma non risolve il problema che lo sviluppatore deve ancora sapere cosa invalidare quando e queste definizioni sono distribuite in tutti i nostri restclients.
Potresti sostenere che questo non dovrebbe essere un problema e devo ammettere che all'inizio non lo era. Ma man mano che il codebase diventa più grande, gli oggetti cambiano nome, questo sta diventando un incubo di gestione con numerosi bug report come risultato.
Quindi la mia domanda è:
Conoscete eventuali strategie di caching o strutture che posso esaminare per risolvere il nostro caso?
Sto pensando più alla direzione di definire un grafico delle dipendenze e spero che qualcuno abbia già affrontato questo problema che potrebbe darci nuove intuizioni.