sql >> Database >  >> NoSQL >> Redis

is het mogelijk om lua-functies aan te roepen die zijn gedefinieerd in andere lua-scripts in redis?

Ik ga tegen het geaccepteerde antwoord in, omdat het geaccepteerde antwoord fout is.

Hoewel u benoemde functies niet expliciet kunt definiëren, kunt u wel roep een willekeurig script aan dat je kunt aanroepen met EVALSHA . Meer specifiek, alle Lua-scripts die u expliciet hebt gedefinieerd via SCRIPT LOAD of impliciet via EVAL zijn beschikbaar in de globale Lua-naamruimte op f_<sha1 hash> (tot/tenzij je SCRIPT FLUSH belt ), die u op elk moment kunt bellen.

Het probleem dat je tegenkomt is dat de functies zijn gedefinieerd als het nemen van geen argumenten, en de KEYS en ARGV tabellen zijn eigenlijk globals. Dus als je wilt kunnen communiceren tussen Lua-scripts, moet je ofwel je KEYS mangelen en ARGV tabellen, of u moet de standaard Redis-toetsruimte gebruiken voor communicatie tussen uw functies.

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>

Dit alles gezegd hebbende, dit is volledig in strijd met de specificaties en het is heel goed mogelijk om op vreemde manieren te stoppen met werken als je probeert dit in een Redis-clusterscenario uit te voeren.



  1. Is Redis slechts een cache?

  2. MongoDB $asin

  3. Redis uitvoeren op Travis CI

  4. Hoe SCAN te gebruiken met de MATCH-optie in Predis