sql >> Databasteknik >  >> NoSQL >> Redis

är det möjligt att anropa lua-funktioner definierade i andra lua-skript i redis?

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.



  1. Tillfälligt fel i namnupplösning redis

  2. Apache Phoenix för CDH

  3. konvertera iso-datum till tidsstämpel i mongo-fråga

  4. Geografiskt distribuerade MongoDB Replica Sets för 100 % drifttid