2017-06-30 15 views
3

私は、Luaを使ってSCANを反復する推奨された方法を探していましたが、そのために "ベストプラクティス"があるかどうか疑問に思っていました。以下のスクリプトは、私が今までに見つけた最高のものでした。誰も追加するものはありますか? COUNT 1000000000を使用して反復するのが賢明ですか?それはブロックされませんか?撮影Lua for RedisでSCANを繰り返すにはどのような方法が推奨されますか?

local ans, has, cursor = {}, {}, "0"; 
repeat 
    local t = redis.call("SCAN", cursor, "MATCH", KEYS[1], "COUNT", 1000000000); 
    local list = t[2]; 
    for i = 1, #list do 
     local s = list[i]; 
     if has[s] == nil then has[s] = 1; ans[#ans + 1] = s; end; 
    end; 
    cursor = t[1]; 
until cursor == "0"; 
return #ans; --or return ans; 

https://github.com/antirez/redis/issues/3190#issuecomment-214022437

答えて

1

スクリプト、それが終了するまで、それが実行されている間ブロックします - あなたの例ではSCAN寧が完了したら、どうなること。 COUNTコマンドへのヒントが大きいほど、結果の呼び出しが多くなり、応答を格納するために必要なRAMが増えます(変数t)。これはメモリ不足の状態につながる可能性がありますので、このような大きな値を使用しないようにしてください。COUNT私はデフォルト(100)を守り、ちょうどCOUNTのヒントを省略することをお勧めします。

+0

このように、スクリプトはアトミックでブロックされているため、唯一の懸案事項は、COUNTが大量のRAMを使用する可能性があることです。 Itamarに感謝します。 – geoyws

関連する問題