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
相关产品推荐
相关产品推荐

