Eu vou ser contrário à resposta aceita, porque a resposta aceita está errada.
Embora você não possa definir explicitamente funções nomeadas, você pode chame qualquer script que você possa chamar com
EVALSHA
. Mais especificamente, todos os scripts Lua que você definiu explicitamente via SCRIPT LOAD
ou implicitamente via EVAL
estão disponíveis no namespace Lua global em f_<sha1 hash>
(até/a menos que você chame SCRIPT FLUSH
), que você pode chamar a qualquer momento. O problema que você encontra é que as funções são definidas como sem argumentos, e as
KEYS
e ARGV
tabelas são realmente globais. Então, se você quiser se comunicar entre scripts Lua, você precisa desmontar suas KEYS
e ARGV
tabelas, ou você precisa usar o keyspace padrão do Redis para comunicação entre suas funções. 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>
Tudo isso dito, isso é uma violação completa da especificação e é totalmente possível parar de funcionar de maneiras estranhas se você tentar executar isso em um cenário de cluster Redis.