Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Redis C# – Verwendung des Incr-Werts in einer Transaktion

Es gibt ein grundlegendes Merkmal von redis MULTI/EXEC-Einheiten, das bedeutet, dass Sie nicht können Ergebnisse während der Operation erhalten. Daher gibt es zwei gängige Möglichkeiten, um das zu tun, was Sie fragen:

  1. Verwenden Sie Lua (ScriptEvaluate[Async] ); Ein Lua-Skript wird von Anfang bis Ende auf dem Server ausgeführt, ist effizient und vermeidet alle Probleme im Zusammenhang mit der Umlaufzeit (Latenz oder Bandbreite) oder der Konkurrenz durch andere Verbindungen
  2. Verwenden Sie eine optimistische Schleife, die den aktuellen Wert liest und dann eine Transaktion in SE-Redis erstellt, die eine Einschränkung hinzufügt dass der Wert, den Sie gerade gelesen haben, derselbe ist, und führen Sie die Nebeneffekte innerhalb der Transaktion aus; die Bibliothek wird die notwendige WATCH-etc-Maschinerie koordinieren, um dies robust zu machen, aber wenn sich herausstellt, dass die Einschränkungsbedingung ungültig ist (d. h. die Bibliothek gibt false zurück ), müssen Sie alles von Anfang an wiederholen

Ehrlich gesagt würde ich die Leute heutzutage immer zu Option 1 führen; Option 2 ist nur "ansprechend" (und ich verwende diesen Begriff ziemlich falsch), wenn serverseitiges Lua-Skripting nicht verfügbar ist.

Ich bin nicht an einem PC, aber ich vermute, das Skript würde in etwa so aussehen:

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