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

Azure Redis TimeSeries执行TS.RANGE报错wrong fromTimestamp求助

问题原因及解决办法

错误根源

报错ERR TSDB: wrong fromTimestamp的核心原因是传递给TS.RANGE的时间戳不是整数类型。

在Lua脚本中,若通过redis.call('TIME')计算毫秒级时间戳时未做整数转换,会产生浮点数(比如将微秒转毫秒时的除法操作)。而RedisTimeSeries的TS.RANGE要求fromTimestamp和toTimestamp必须是整数,浮点数参数会被判定为非法格式,触发报错。

正确的Lua脚本实现

以下是符合你业务逻辑的完整脚本,同时规避时间戳类型问题:

-- KEYS[1]: 时序数据键名(如"12345678:5")
-- ARGV[1]: 时间范围毫秒数(如1800000,即30分钟)
-- ARGV[2]: 阈值(如20)

-- 获取当前毫秒级时间戳(确保为整数)
local time_info = redis.call('TIME')
local now_ms = time_info[1] * 1000 + math.floor(time_info[2] / 1000)
local start_ms = now_ms - tonumber(ARGV[1])

-- 查询最近指定时间范围内的时序数据
local ts_data = redis.call('TS.RANGE', KEYS[1], start_ms, now_ms)

-- 计算数值总和
local sum = 0
for _, entry in ipairs(ts_data) do
    sum = sum + tonumber(entry[2])
end

-- 业务逻辑判断
if sum >= tonumber(ARGV[2]) then
    return 0
else
    -- 新增时序数据(当前时间戳+数值,可根据实际需求调整数值)
    redis.call('TS.ADD', KEYS[1], now_ms, 1)
    return 1
end

关键注意点

  • 必须用math.floor()将微秒转毫秒的结果转为整数,避免浮点数产生。
  • 所有传递给Redis命令的数值参数,都要用tonumber()确保是数字类型,避免字符串类型参数导致错误。
  • 确认start_ms始终小于now_ms(这里通过now_ms - 时间范围保证,不会出现范围反转的问题)。

C#调用提示

在C#代码中调用该脚本时,需将键名放入RedisKey[]参数,时间范围、阈值放入RedisValue[]参数,示例如下:

var luaScript = @"[上述Lua脚本内容]";
var result = await redis.ScriptEvaluateAsync(
    luaScript,
    new RedisKey[] { "12345678:5" },
    new RedisValue[] { 1800000, 20 }
);

内容的提问来源于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.11 17:03:17