Domanda

Secondo la mia comprensione, ciascuno di questi metodi: get () e put () sono atomici.

Ma quando si accede alle cache come ehcache & amp; memcached, in un modo CheckThenAct , sorgeranno le condizioni di gara.

Cosa dovremmo sincronizzare per assicurarci che se thread1 fa un Get () e thread2 fa un Get () seguito da un Put () , che il primo Get () riceverà il nuovo valore aggiunto da thread2 ?

È stato utile?

Soluzione

Il modo per gestire questo tipo di situazione è di non memorizzare nella cache scritture da più posizioni o di controllare l'accesso in qualche altro modo.

Una soluzione semplice a questo è quella di non fare alcuna scrittura nella cache dai client. Invece, se si desidera aggiornare il valore, si innesca una richiesta per aggiornare il valore. Se quel valore viene recuperato da qualche altra parte, allora può funzionare bene. Se viene calcolato o proviene in altro modo dal client, può essere più problematico.

Un componente comune da utilizzare con memcache & # 8212; almeno nel mondo PHP & # 8212; è beanstalkd come processore di coda di lavoro distribuito. In questo scenario puoi attivare una "quot cache di aggiornamento" richiesta come unità di lavoro.

Se si sta eseguendo un'operazione sulla voce della cache che utilizza il valore esistente come input o in qualche altro modo si introdurrebbe una condizione di competizione se get-then-update non fosse un'operazione atomica, un'alternativa è creare un unità di lavoro che include il vecchio valore e il nuovo valore. In questo modo, qualunque processo gestisca gli aggiornamenti può invalidare o altrimenti gestire quelle situazioni in cui il valore corrente non è il valore previsto.

L'incremento e il decremento sono gestiti dall'interfaccia memcached quindi se i tuoi accessi sono di quel tipo (o possono essere ridotti a quel tipo di operazione), allora anche questo risolve il problema.

Altri suggerimenti

Per memcached è possibile utilizzare l'operazione cas () per verificare prima di eseguire put () che un'altra operazione non abbia aggiornato i dati.

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