テーブルをループして複数を次々に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"
...
entryid
Redis の組み込み 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 に送信する方法はありますか?