Sarò contrario alla risposta accettata, perché la risposta accettata è sbagliata.
Anche se non puoi definire esplicitamente funzioni con nome, puoi chiama qualsiasi script che puoi chiamare con EVALSHA
. Più in particolare, tutti gli script Lua che hai definito esplicitamente tramite SCRIPT LOAD
o implicitamente tramite EVAL
sono disponibili nello spazio dei nomi globale Lua in f_<sha1 hash>
(finché/a meno che non chiami SCRIPT FLUSH
), che puoi chiamare in qualsiasi momento.
Il problema che incontri è che le funzioni sono definite come senza argomenti e le KEYS
e ARGV
le tabelle sono in realtà globali. Quindi, se vuoi essere in grado di comunicare tra gli script Lua, devi modificare le tue KEYS
e ARGV
tabelle, oppure è necessario utilizzare lo spazio dei tasti Redis standard per la comunicazione tra le funzioni.
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>
Detto questo, ciò è in completa violazione delle specifiche ed è del tutto possibile smettere di funzionare in modi strani se si tenta di eseguirlo in uno scenario di cluster Redis.