You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 05:38:19