sql >> Databáze >  >> NoSQL >> Redis

Redis C# - Použití hodnoty Incr v transakci

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:

  1. 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í
  2. 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



  1. MongoDB $weeklyUpdate #66 (22. dubna 2022):Hackathons, mongosh a Github

  2. Vytvořte agregaci filtrů na jaře

  3. StackExchange TimeoutException při pokusu o vložení 750 položek ve 2 sadách v redis

  4. Operátor agregace MongoDB $count