Jag kommer att vara emot det accepterade svaret, eftersom det accepterade svaret är fel.
Även om du inte explicit kan definiera namngivna funktioner, kan anropa alla skript som du kan anropa med EVALSHA
. Mer specifikt, alla Lua-skript som du uttryckligen har definierat via SCRIPT LOAD
eller implicit via EVAL
är tillgängliga i den globala Lua-namnrymden på f_<sha1 hash>
(tills/om du inte anropar SCRIPT FLUSH
), som du kan ringa när som helst.
Problemet som du stöter på är att funktionerna är definierade som att de inte tar några argument, och KEYS
och ARGV
Tabeller är faktiskt globala. Så om du vill kunna kommunicera mellan Lua-skript måste du antingen mangla dina KEYS
och ARGV
tabeller, eller så behöver du använda Redis standardknapputrymme för kommunikation mellan dina funktioner.
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>
Allt detta sagt, detta bryter fullständigt mot specifikationerna, och det är fullt möjligt att sluta fungera på konstiga sätt om du försöker köra detta i ett Redis-klusterscenario.