Będę sprzeczny z zaakceptowaną odpowiedzią, ponieważ zaakceptowana odpowiedź jest błędna.
Chociaż nie możesz jawnie zdefiniować nazwanych funkcji, możesz wywołaj dowolny skrypt, który możesz wywołać za pomocą EVALSHA
. Dokładniej, wszystkie skrypty Lua, które zostały wyraźnie zdefiniowane przez SCRIPT LOAD
lub niejawnie przez EVAL
są dostępne w globalnej przestrzeni nazw Lua pod adresem f_<sha1 hash>
(dopóki/chyba że zadzwonisz SCRIPT FLUSH
), które możesz zadzwonić w dowolnym momencie.
Problem, z którym się spotykasz, polega na tym, że funkcje są zdefiniowane jako nie przyjmujące argumentów, a KEYS
i ARGV
tabele są w rzeczywistości globalami. Więc jeśli chcesz mieć możliwość komunikowania się między skryptami Lua, musisz albo pokiereszować swoje KEYS
i ARGV
tabele lub musisz użyć standardowego obszaru klawiszy Redis do komunikacji między funkcjami.
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>
Wszystko to powiedziawszy, jest to całkowite naruszenie specyfikacji i jest całkowicie możliwe, aby przestać działać w dziwny sposób, jeśli spróbujesz uruchomić to w scenariuszu klastra Redis.