Existuje základní vlastnost jednotek redis MULTI/EXEC, která znamená, že nemůžete získat výsledky během operace. Proto existují dva běžné způsoby, jak udělat to, co požadujete:
- Použijte Lua (
ScriptEvaluate[Async]
); skript Lua se spustí na serveru od začátku do konce, je efektivní a vyhýbá se všem problémům spojeným s dobou zpáteční cesty (latence nebo šířka pásma) nebo konkurencí jiných připojení - Použijte optimistickou smyčku, která přečte aktuální hodnotu, a poté vytvoří transakci v SE-Redis, která přidá omezení že hodnota, kterou jste právě přečetli, je stejná a provede vedlejší efekty uvnitř transakce; knihovna bude koordinovat nezbytné stroje WATCH atd., aby to bylo robustní, ale pokud se omezující podmínka ukáže jako neplatná (tj. knihovna vrátí
false
), je potřeba vše znovu udělat od začátku
Upřímně řečeno, v dnešní době bych vždy vedl lidi k možnosti 1; možnost 2 je „atraktivní“ (a tento výraz používám zcela nesprávně), pokud není k dispozici skriptování Lua na straně serveru.
Nejsem u PC, ale hádám, že skript bude vypadat nějak takto:
local id = redis.call("incr", KEYS[1])
redis.call("hset", KEYS[2], tostring(id), ARGV[1])
return id