Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Ist es möglich, in Redis definierte Lua-Funktionen in anderen Lua-Skripten aufzurufen?

Ich werde der akzeptierten Antwort widersprechen, weil die akzeptierte Antwort falsch ist.

Obwohl Sie benannte Funktionen nicht explizit definieren können, können Sie Rufen Sie jedes Skript auf, das Sie mit EVALSHA aufrufen können . Genauer gesagt, alle Lua-Skripte, die Sie explizit über SCRIPT LOAD definiert haben oder implizit über EVAL sind im globalen Lua-Namespace unter f_<sha1 hash> verfügbar (bis/es sei denn, Sie rufen SCRIPT FLUSH auf ), die Sie jederzeit anrufen können.

Das Problem, auf das Sie stoßen, ist, dass die Funktionen so definiert sind, dass sie keine Argumente annehmen, und die KEYS und ARGV Tabellen sind eigentlich Globals. Wenn Sie also in der Lage sein wollen, zwischen Lua-Skripten zu kommunizieren, müssen Sie entweder Ihre KEYS verstümmeln und ARGV Tabellen, oder Sie müssen den standardmäßigen Redis-Schlüsselraum für die Kommunikation zwischen Ihren Funktionen verwenden.

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>

Alles in allem verstößt dies gegen die Spezifikation und es ist durchaus möglich, dass es auf seltsame Weise nicht mehr funktioniert, wenn Sie versuchen, dies in einem Redis-Cluster-Szenario auszuführen.