sql >> データベース >  >> NoSQL >> Redis

他のluaスクリプトで定義されているlua関数をredisで呼び出すことは可能ですか?

    受け入れられた答えが間違っているので、私は受け入れられた答えに反するつもりです。

    名前付き関数を明示的に定義することはできませんが、できます。 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クラスターシナリオでこれを実行しようとすると、奇妙な方法で動作を停止する可能性があります。



    1. MongooseおよびMongoDBNode.JSドライバーのロギングを有効にする方法

    2. ResqueとRailsを使用したRedis:使用メモリ>'maxmemory'の場合はERRコマンドは許可されません

    3. MongoDBの接続文字列(例付き)

    4. MongoDBレプリカセットの開発者ガイド