如何在Lua脚本中对Redis TS.RANGE返回的所有值求和?
解决Azure Redis Enterprise时间序列Lua脚本求和错误
错误原因
"attempt to call a table value" 错误通常是因为脚本中误将table类型的值当作函数调用,比如遍历TS.RANGE返回的数组时,错误地对值数组使用函数调用语法(如v()),而非直接访问数组元素。
正确的求和Lua脚本
以下是可对指定键的时间序列所有值求和的正确脚本:
local key = KEYS[1] -- 获取该时间序列的全量数据,"-"代表最早时间点,"+"代表最新时间点 local ts_entries = redis.call('TS.RANGE', key, '-', '+') local total = 0 -- 遍历每个[时间戳, 数值]的子数组 for _, entry in ipairs(ts_entries) do -- entry[2]是时间序列的数值,转为数字后累加 total = total + tonumber(entry[2]) end return total
C#调用示例
在C#中通过ScriptEvaluateAsync调用该脚本的示例代码:
var redisConn = ConnectionMultiplexer.Connect("你的Redis连接字符串"); var db = redisConn.GetDatabase(); var sumScript = @"local key = KEYS[1] local ts_entries = redis.call('TS.RANGE', key, '-', '+') local total = 0 for _, entry in ipairs(ts_entries) do total = total + tonumber(entry[2]) end return total"; var sumResult = await db.ScriptEvaluateAsync(sumScript, new RedisKey[] { "key1" }); // 输出求和结果,示例中应为4 Console.WriteLine((long)sumResult);
关键注意事项
- 使用
ipairs遍历TS.RANGE返回的数组,因为它是有序索引数组 - 必须用
tonumber将entry[2]转为数值类型,避免字符串拼接导致的逻辑错误 - 确保Redis实例已启用TimeSeries模块,否则TS.RANGE命令会执行失败
内容的提问来源于stack exchange,提问作者Alexander Farber
相关产品推荐
相关产品推荐

