Básicos Redis: Lua

Redis

Lua es un lenguaje de script de lado servidor, se podría decir que es de alguna forma los procedimientos almacenados de Redis, se ejecutan de forma atómica dentro de una transacción.

Un script se puede ejecutar durante 5 segundos antes de que Redis empiece a aceptar la ejecución de otros comandos, este parámetro se puede modificar pero el comportamiento es similar, los otros comandos empezarán a recibir mensajes de que el sistema está ocupado, se puede cerrar el script usado la instrucción SCRIPT KILL lo que hará un cierre seguro siempre que el script sea de solo lectura y no haya modificado ningún dato en caso de que lo haya hecho habrá que usar SHUTDOWN NOSAVE que provocará que pueda haber inconsistencias

Conversión de tipos

Redis valueLua value
IntegerNumber
Bulk replyString
Multi bulk replyTable (con otros tipos anidados)
Status replyTabla con campo «ok» indicando el estado
Redis errorTabla con campo «err» indicando el error
nil bulk reply and nil multi replyFalso (booleano)
Conversión tipos

Lua no usa números de punto flotante por lo que cualquier número con decimales se tiene que guardar como string. Una tabla Lua se puede devolver por ejemplo usando el comando HSCAN, también se pueden crear tablas al vuelo haciendo por ejemplo:
eval «return {KEYS[1], {ARGV[1], ARGV[2]}}» 1 hash-key field1 field2
Devolvería:
1) «hash-key»
2) 1) «field1»
2) «field2»

Elementos básicos

Algunos elementos básicos que se pueden usar en LUA parecidos a la programación tradicional.

Variables

Declarar variables locales

eval «local val=42 return val» 0
Este comando devolverá 42

if – else – then

if ARGV[1] == «sum» and ARGV[0] == «op» then
return k1 + k2
elseif ARGV[1] == «max» and ARGV[2] <= 10 then
return math.max(k1, k2)
else
return nul
end

Comentarios

Usando dos guiones —

— Convert arguments to numbers

Concatenar cadenas

Usando ..

local hold_key = ‘holds:’ .. KEYS[1]

Bucles

for _, hold_key in ipairs(hold_keys) do
local count = redis.call(‘HGET’, hold_key, ‘qty’)
— If the return is nil, then remove the hold from the list
if (count == nil) then
redis.call(‘SREM’, ticket_hold_key, hold_key)
else
tickets_held = tickets_held + count
end
end
return tickets_held

Comandos

Algunos comandos básicos asociados o necesarios para LUA

EVAL

Evalúa la expresión dada

Sintaxis

EVAL script numkeys key1 [keyN …] arg1 [argN…]

  • script: Script que se ejecutará.
  • numkeys: El número de key names que se utilizarán.
  • key: Las keys que se van a utilizar.
  • arg: Cualquier argumento extra necesario.

Ejemplo

eval «return redis.call(‘HGET, KEYS[1|], ARGV[1])» 1 hash-key field2

KEYS[1] es el primer elementos de keys (hash-key)
ARGV[1] es el primer argumento (field2)

Redis.call Redis.pcall

call devuelve el error y provoca que falle EVAL mientras que pcall devolverá devuelve una estructura representando la respuesta del error.

SCRIPT LOAD

Carga el script en Redis y devuelve un hash así se puede invocar el script usando el hash evitando tener que enviarlo cada vez optimizando el proceso.

Sintaxis

SCRIPT LOAD script

  • script: Script que se cargará.

Ejemplo

eval «local val=redis.call(‘GET’, KEYS[1|]) return val»

EVALSHA

Evalua un script pero usando su hash que se obtiene a través del comando SCRIPT LOAD.

Sintaxis

EVALSHA sha1 numkeys key1 [keyN …] arg1 [argN…]

  • sha1: Digest del script que se ejecutará.
  • numkeys: El número de key names que se utilizarán.
  • key: Las keys que se van a utilizar.
  • arg: Cualquier argumento extra necesario.

SCRIPT EXISTS

Comprueba si un script existe

Sintaxis

script exists sha1… [shaN]

SCRIPT FLUSH

Elimina todos los scripts que haya en caché.

SCRIPT KILL

Cierra el script en ejecución, por ejemplo si está tardando demasiado.

SCRIPT DEBUG [YES|SYNC|NO]

No se recomienda usar en producción porque durante la depuración no se acepta la ejecución de otro comando.

SHUTDOWN NOSAVE

Reinicia sin guardar.

Básicos Redis: Lua