受け入れられた答えが間違っているので、私は受け入れられた答えに反するつもりです。
名前付き関数を明示的に定義することはできませんが、できます。 EVALSHA
で呼び出すことができる任意のスクリプトを呼び出す 。具体的には、SCRIPT LOAD
を介して明示的に定義したすべてのLuaスクリプト または暗黙的にEVAL
を介して f_<sha1 hash>
のグローバルLua名前空間で利用可能です (SCRIPT FLUSH
を呼び出すまで/ )、いつでも呼び出すことができます。
あなたが遭遇する問題は、関数が引数を取らないように定義されており、KEYS
およびARGV
テーブルは実際にはグローバルです。したがって、Luaスクリプト間で通信できるようにする場合は、KEYS
を壊す必要があります。 およびARGV
テーブル、または関数間の通信に標準のRedisキースペースを使用する必要があります。
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>
とはいえ、これは仕様に完全に違反しており、Redisクラスターシナリオでこれを実行しようとすると、奇妙な方法で動作を停止する可能性があります。