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

¿Es posible llamar a funciones lua definidas en otros scripts lua en redis?

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.