Come evitare di caricare il valore che non è presente nella cache molte volte simultaneamente, nel modo efficiente?Come impedire il caricamento simultaneo di valori non memorizzati più volte?
Un tipico utilizzo della cache è pseudocodice seguente:
Object get(Object key) {
Object value = cache.get(key);
if (value == null) {
value = loadFromService(key);
cache.set(key,value);
}
return value;
}
Il problema: prima che il valore viene caricato dal servizio (Database, WebService, RemoteEJB o altro) una seconda chiamata può essere effettuata nello stesso tempo , che renderà il valore caricato ancora una volta. Ad esempio, quando memorizzo nella cache tutti gli elementi per l'utente X, e questo utente viene spesso visualizzato e contiene molti elementi, c'è un'alta probabilità di chiamare simultaneamente il carico di tutti gli elementi, con conseguente carico gravoso sul server .
Potrei effettuare la funzione get
sincronizzata, ma questo forzerebbe altre ricerche ad attendere, non ha molto senso. Potrei creare nuovo blocco per ogni chiave, ma non so se è una buona idea gestire un numero così grande di blocchi in Java (questa parte è specifica della lingua, la ragione per cui l'ho etichettata come java
) .
Oppure c'è un altro approccio che potrei usare? Se sì, quale sarebbe il più efficiente?
Stai pensando troppo seriamente a questo. A meno che il tempo di caricare i dati dal servizio sia tremendamente lungo, questo non sarà mai un problema. – pablochan
Ho un codice EJB alieno che può richiedere fino a 20 secondi nell'ambiente di test, quindi temo cosa succederebbe con 10 o 20 richieste simultanee –