Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

é possível chamar funções lua definidas em outros scripts lua no redis?


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.