在启用了TimeSeries模块的Azure Redis Enterprise中,我在键“key1”处有以下4个值为1的时间序列:
$ TS.RANGE key1 - +
1) 1) (integer) 1693381431951
2) 1
2) 1) (integer) 1693381435201
2) 1
3) 1) (integer) 1693381436720
2) 1
4) 1) (integer) 1693381438037
2) 1
我可以通过Lua脚本检索相同的结果:
$ EVAL "return redis.call('TS.RANGE', KEYS[1], '-', '+')" 1 key1
1) 1) (integer) 1693381431951
2) 1
2) 1) (integer) 1693381435201
2) 1
3) 1) (integer) 1693381436720
2) 1
4) 1) (integer) 1693381438037
2) 1
我的问题是如何将这些值相加(并在所示情况下得到4)?
我正在尝试以下Lua代码:
$ EVAL "local sum = 0; for stamp, val in redis.call('TS.RANGE', KEYS[1], '-', '+') do sum = sum + val end; return sum" 1 key1
(error) ERR Error running script (call to f_28243bc2b451f1770c76c1d7fcce23e7285f3baa): @user_script:1: user_script:1: attempt to call a table value
TS.RANGE不是返回时间戳和数值对吗?
我的背景是,我在C#应用程序中调用ScriptEvaluateAsync()
,并希望在给定键时对时间序列中的所有值求和。
2条答案
按热度按时间jtw3ybtb1#
这可能会有点混乱,Redis Lua调试器可以提供帮助(https://redis.io/docs/interact/programmability/lua-debugging/)。
这里有一个解决方案,将做你需要的,但Lua可能会优化-我不是一个LuaMaven:)
这将解包
TS.RANGE
响应并对值求和。让我们设置一些数据来使用它:看看我们有什么:
现在让我们将脚本存储在redis服务器中(我将脚本放在一个名为
sumts.lua
的文件中:我们得到了脚本的SHA值,可以用它来调用它:
我们得到整数响应4,时间序列中的值之和。
下面是一个如何在Lua调试器中运行此脚本并查看局部变量的示例:
然后...
您可以继续使用
n
来遍历循环。希望这对你有帮助。
dgenwo3n2#
通过研究
cjson.encode(tsrange)
,我提出了以下解决方案,我也想分享一下:int sum = 0; local tsrange = redis.call('TS. RANGE',KEYS[1],'-','+');对于i = 1,#tsrange do sum = sum + tsrange[i][2]'ok'] end; return sum”1 key1
然后我在我的C#应用程序中调用它: