3

テーブルをループして複数を次々にredis.call('HMGET',[key],...)実行するのではなく、テーブルを単一に渡すのと同様の動作はありますか?redis.call


Redis には、100000 エントリのフェンウィック ツリーを表すハッシュ キーがあります。連続する整数インデックスと float 値があります。

127.0.0.1:6379[1]> hmget fenwick 1 2 3 4 ...
1) "0.75865226460558"
2) "1.0234678955857959"
3) "0.057608450324092272"
4) "1.1002286486794375"
...

entryidRedis の組み込み Lua インタープリターを使用して、ランダムなエントリの合計を見つけようとしています。明らかに、これを行う単純な方法は、次のように一度に 1 つずつテーブルに対して単一のアクセスを実行することです。

local sum=0
while entryid>0 do
    sum=sum+redis.pcall('HGET',KEYS[1],temp)
    entryid=entryid-bit.band(entryid,-entryid)
end

HMGETすべてのコマンドを 1 つに圧縮し、往復を減らすために、文字列を生成してロードしようとしました。

local evalstr="return redis.pcall('HMGET',KEYS[1]"
local sum=0
while entryid>0 do
    evalstr=evalstr..','..temp
    entryid=entryid-bit.band(temp,-temp)
end
local vals=loadstring(evalstr..')')()
for i=1,#vals do
    sum=sum+vals[i]
end

ただし、コンパイルのオーバーヘッドにより、サイズfenwickに関係なく、このクエリは最初のクエリよりも遅くなります。

基本的に、私はこの動作を探しています:

local tbl={}
local c=1
while temp>0 do
    tbl[c]=temp
    c=c+1
    temp=temp-bit.band(temp,-temp)
end
local vals=redis.pcall('HMGET',KEYS[1],tbl)
local sum=0
for i=1,#vals do
    sum=sum+vals[i]
end

しかし、明らかにそれは機能しません。最初に Lua で Redis にクエリしたいすべての値を収集し、それらを 1 つのコマンドで Redis に送信する方法はありますか?

4

1 に答える 1

3

組み込み関数を使用して、Lua テーブルを可変引数関数への一連の引数に変換できunpackます。

あなたの場合、Lua スクリプトで次のようにします。

redis.pcall('HMGET',KEYS[1],unpack(tbl))
于 2015-04-13T13:40:04.037 に答える