2015-02-14 17 views
6

Ho usato solo Redis come mio DB e il mio client è ServiceStack.Redis. Il fatto è che se due richieste simultanee devono aggiornare una chiave, allora può essere una condizione di competizione. Per esempioCome posso prevenire le condizioni di gara usando Redis?

A:

  1. int a = Get chiave
  2. MULTI
  3. a = a - 100
  4. Impostare la chiave di un
  5. EXEC

B:

  1. int a = Get chiave
  2. MULTI
  3. a = a - 100
  4. Impostare la chiave di un
  5. EXEC

se il la "chiave" di origine è 1000. Se la sperazione A e B sono di serie I risultati giusti di queste due operazioni di "chiave" saranno 800. Ma se A e B si verificano nello stesso tempo. Prima che A possa eseguire il commit, l'operazione B ottiene il valore 1000 da "chiave" e imposta 900 su "chiave". Non è quello che voglio. Come posso evitare questo tipo di condizioni di gara, utilizzare "GUARDA"?

+0

Sì, utilizzare WATCH. –

risposta

5

Si consiglia di leggere i documenti su Transactions in Redis, le transazioni in Redis sono essenzialmente batch di più operazioni in modo che vengano eseguite come una singola operazione atomica.

Poiché si tratta solo di operazioni di batch, non è possibile eseguire letture nel contesto di una transazione. Tutte le letture necessarie prima della mano devono essere recuperate prima dell'inizio della transazione. È quindi possibile utilizzare Redis WATCH per controllare eventuali chiavi che non devono essere modificate prima del completamento della transazione, se una chiave è stata modificata, la transazione avrà esito negativo e nessuna operazione verrà elaborata.

+0

Grazie per avermelo ricordato. Nel mio programma, ho letto prima di iniziare una transazione nel mio programma. Ho cambiato il mio pseudo codice in un ordine corretto. Quindi, WATCH dovrebbe risolvere il mio problema? –

+0

@AllanYang Sì utilizzando WATCH prima che qualsiasi lettura assicuri che la transazione non venga eseguita se la chiave è stata modificata prima dell'esecuzione della transazione. – mythz