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 value | Lua value |
| Integer | Number |
| Bulk reply | String |
| Multi bulk reply | Table (con otros tipos anidados) |
| Status reply | Tabla con campo «ok» indicando el estado |
| Redis error | Tabla con campo «err» indicando el error |
| nil bulk reply and nil multi reply | Falso (booleano) |
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.
