Voy a ser contrario a la respuesta aceptada, porque la respuesta aceptada es incorrecta.
Si bien no puede definir explícitamente funciones con nombre, puede llame a cualquier script que pueda llamar con EVALSHA
. Más específicamente, todos los scripts de Lua que haya definido explícitamente a través de SCRIPT LOAD
o implícitamente a través de EVAL
están disponibles en el espacio de nombres Lua global en f_<sha1 hash>
(hasta/a menos que llame a SCRIPT FLUSH
), a la que puede llamar en cualquier momento.
El problema con el que te encuentras es que las funciones están definidas sin argumentos y las KEYS
y ARGV
las tablas son en realidad globales. Entonces, si desea poder comunicarse entre los scripts de Lua, debe manipular sus KEYS
y ARGV
tablas, o necesita usar el espacio de teclas Redis estándar para la comunicación entre sus funciones.
127.0.0.1:6379> script load "return {KEYS[1], ARGV[1]}" "d006f1a90249474274c76f5be725b8f5804a346b" 127.0.0.1:6379> eval "return f_d006f1a90249474274c76f5be725b8f5804a346b()" 1 "hello" "world" 1) "hello" 2) "world" 127.0.0.1:6379> eval "KEYS[1] = 'blah!'; return f_d006f1a90249474274c76f5be725b8f5804a346b()" 1 "hello" "world" 1) "blah!" 2) "world" 127.0.0.1:6379>
Dicho todo esto, esto es una violación total de las especificaciones y es muy posible que deje de funcionar de manera extraña si intenta ejecutar esto en un escenario de clúster de Redis.