Redis
 sql >> Database >  >> NoSQL >> Redis

è possibile chiamare le funzioni lua definite in altri script lua in redis?

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.