Redis
 sql >> Baza danych >  >> NoSQL >> Redis

czy możliwe jest wywołanie funkcji lua zdefiniowanych w innych skryptach lua w redis?

Będę sprzeczny z zaakceptowaną odpowiedzią, ponieważ zaakceptowana odpowiedź jest błędna.

Chociaż nie możesz jawnie zdefiniować nazwanych funkcji, możesz wywołaj dowolny skrypt, który możesz wywołać za pomocą EVALSHA . Dokładniej, wszystkie skrypty Lua, które zostały wyraźnie zdefiniowane przez SCRIPT LOAD lub niejawnie przez EVAL są dostępne w globalnej przestrzeni nazw Lua pod adresem f_<sha1 hash> (dopóki/chyba że zadzwonisz SCRIPT FLUSH ), które możesz zadzwonić w dowolnym momencie.

Problem, z którym się spotykasz, polega na tym, że funkcje są zdefiniowane jako nie przyjmujące argumentów, a KEYS i ARGV tabele są w rzeczywistości globalami. Więc jeśli chcesz mieć możliwość komunikowania się między skryptami Lua, musisz albo pokiereszować swoje KEYS i ARGV tabele lub musisz użyć standardowego obszaru klawiszy Redis do komunikacji między funkcjami.

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>

Wszystko to powiedziawszy, jest to całkowite naruszenie specyfikacji i jest całkowicie możliwe, aby przestać działać w dziwny sposób, jeśli spróbujesz uruchomić to w scenariuszu klastra Redis.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Ściągawka z optymalizacją pamięci Redis

  2. Przecięcie dwóch lub więcej posortowanych zbiorów

  3. Jak uruchomić serwer Redis ORAZ inną aplikację w Dockerze?

  4. Redis:Czy ZADD jest lepszy niż O(logN), gdy wstawiony element znajduje się na początku lub na końcu?

  5. Jak skonfigurować sesje Spring do pracy z Redis w xml?