Redis
 sql >> Base de données >  >> NoSQL >> Redis

est-il possible d'appeler des fonctions lua définies dans d'autres scripts lua dans redis ?

Je vais être contraire à la réponse acceptée, car la réponse acceptée est fausse.

Bien que vous ne puissiez pas définir explicitement des fonctions nommées, vous pouvez appelez n'importe quel script que vous pouvez appeler avec EVALSHA . Plus précisément, tous les scripts Lua que vous avez explicitement définis via SCRIPT LOAD ou implicitement via EVAL sont disponibles dans l'espace de noms global Lua à f_<sha1 hash> (jusqu'à/sauf si vous appelez SCRIPT FLUSH ), que vous pouvez appeler à tout moment.

Le problème que vous rencontrez est que les fonctions sont définies comme ne prenant aucun argument, et les KEYS et ARGV les tables sont en fait globales. Donc, si vous voulez pouvoir communiquer entre les scripts Lua, vous devez soit mutiler vos KEYS et ARGV tables, ou vous devez utiliser l'espace de clés Redis standard pour la communication entre vos fonctions.

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>

Cela dit, cela est en violation totale des spécifications et il est tout à fait possible d'arrêter de fonctionner de manière étrange si vous essayez de l'exécuter dans un scénario de cluster Redis.