Redis
 sql >> Base de données >  >> NoSQL >> Redis

Redis C# - Utilisation de la valeur Incr dans une transaction

Il existe une caractéristique fondamentale des unités redis MULTI/EXEC qui signifie que vous ne pouvez pas obtenir des résultats pendant l'opération. En tant que tel, il existe deux façons courantes de faire ce que vous demandez :

  1. Utiliser Lua (ScriptEvaluate[Async] ); un script Lua s'exécute sur le serveur de bout en bout, est efficace et évite tous les problèmes liés au temps d'aller-retour (latence ou bande passante) ou à la concurrence d'autres connexions
  2. Utiliser une boucle optimiste qui lit la valeur actuelle, puis crée une transaction dans SE-Redis qui ajoute une contrainte que la valeur que vous venez de lire est la même et exécutez les effets secondaires à l'intérieur de la transaction ; la bibliothèque coordonnera la machinerie WATCH etc. nécessaire pour rendre cela robuste, mais si la condition de contrainte s'avère invalide (c'est-à-dire que la bibliothèque renvoie false ), il faut tout refaire depuis le début

Franchement, ces jours-ci, je guiderais toujours les gens vers l'option 1; l'option 2 n'est "attrayante" (et j'utilise ce terme de manière assez incorrecte) que si le script Lua côté serveur n'est pas disponible.

Je ne suis pas sur un PC, mais je suppose que le script ressemblerait à :

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