sql >> Base de Datos >  >> NoSQL >> Redis

Redis C#:uso del valor Incr en una transacción

Hay una característica fundamental de las unidades redis MULTI/EXEC que significa que no puede obtener resultados durante la operación. Como tal, hay dos formas comunes de hacer lo que pides:

  1. Usar Lua (ScriptEvaluate[Async] ); un script Lua se ejecuta en el servidor de principio a fin, es eficiente y evita todos los problemas asociados con el tiempo de ida y vuelta (latencia o ancho de banda) o la competencia de otras conexiones
  2. Utilice un ciclo optimista que lea el valor actual y luego cree una transacción en SE-Redis que agregue una restricción que el valor que acaba de leer es el mismo y ejecutar los efectos secundarios dentro de la transacción; la biblioteca coordinará la maquinaria WATCH, etc. necesaria para que esto sea sólido, pero si la condición de restricción resulta ser inválida (es decir, la biblioteca devuelve false ), necesita rehacer todo desde el principio

Francamente, en estos días siempre guiaría a las personas a la opción 1; la opción 2 solo es "atractiva" (y uso ese término de manera bastante incorrecta) si el script Lua del lado del servidor no está disponible.

No estoy en una PC, pero supongo que el guión se vería así:

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