Redis
 sql >> Database >  >> NoSQL >> Redis

Redis C# - Utilizzo del valore Incr in una transazione

C'è una caratteristica fondamentale delle unità REDIS MULTI/EXEC che significa che non puoi ottenere risultati durante l'operazione. Pertanto, ci sono due modi comuni per fare ciò che chiedi:

  1. Usa Lua (ScriptEvaluate[Async] ); uno script Lua viene eseguito sul server dall'inizio alla fine, è efficiente ed evita tutti i problemi associati al tempo di andata e ritorno (latenza o larghezza di banda) o alla concorrenza di altre connessioni
  2. Utilizza un ciclo ottimistico che legge il valore corrente, quindi crea una transazione in SE-Redis che aggiunge un vincolo che il valore appena letto sia lo stesso ed eseguire gli effetti collaterali all'interno della transazione; la libreria coordinerà il macchinario WATCH etc necessario per renderlo robusto, ma se la condizione di vincolo risulta non valida (cioè la libreria restituisce false ), devi rifare tutto dall'inizio

Francamente, in questi giorni guiderei sempre le persone all'opzione 1; l'opzione 2 è "attraente" (e uso quel termine in modo abbastanza errato) solo se lo scripting Lua lato server non è disponibile.

Non sono su un PC, ma suppongo che lo script assomiglierebbe a qualcosa del tipo:

local id = redis.call("incr", KEYS[1])
redis.call("hset", KEYS[2], tostring(id), ARGV[1])
return id