performance - Redis 中的 Lua 脚本 : HMGET with table?

标签 performance lua redis roundtrip

是否存在将表传递给单个 redis.call('HMGET',[key],...) 的任何类似行为,而不是遍历表并运行多个 >redis.call,一个接一个?


我在 Redis 中有一个散列键,它表示具有 100000 个条目的 Fenwick 树。它有连续的整数索引和浮点值:

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

我正在尝试使用 Redis 的内置 Lua 解释器找到一些随机条目 entryid 的总和。显然,这样做的天真方法是像这样一次一个地对表执行单一访问:

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

我尝试生成并加载一个字符串以将所有命令压缩到一个 HMGET 中并减少往返次数:

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 的所有值,然后在一个命令中将它们发送到 Redis?

最佳答案

您可以使用内置的 unpack 将 Lua 表转换为可变参数函数的一系列参数。功能。

对于您的情况,请在您的 Lua 脚本中执行以下操作:

redis.pcall('HMGET',KEYS[1],unpack(tbl))

关于performance - Redis 中的 Lua 脚本 : HMGET with table?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29594517/

相关文章:

java - Java 在 String 上的工作速度比 ArrayList 慢多少?

performance - ExpressJS压力测试

android - 所有 Corona SDK 项目在舞台上都以某种方式偏离中心,即使是示例代码也是如此

c - 将 C 整数绑定(bind)到 Lua 全局变量

node.js - 无法连接到托管的 redis : Ready check failed: ERR operation not permitted

performance - 成为更好/更高效的 PLC 程序员

lua - Lua表的一个有趣现象

asp.net-mvc - .NET Core 带密码的分布式 Redis 缓存

Redis - 可以查看单个键的命中/未命中吗?

performance - Matlab bsxfun() - 如何解释沿不同维度扩展时的性能差异?