*Redis TS.INCRBY 命令

TS.INCRBY 对时间序列中指定时间戳的值执行加法操作,适用于计数器、累加器等场景。


*语法

TS.INCRBY key timestamp addend [RETENTION retentionPeriod] [ENCODING [COMPRESSED|UNCOMPRESSED]] [CHUNK_SIZE size] [DUPLICATE_POLICY [BLOCK | FIRST | LAST | MIN | MAX | SUM]] [LABELS {label value} ...] [IGNORE ignoreMaxTimediff ignoreMaxValDiff]

*参数说明

参数 类型 必填 说明
key String 时间序列键名
timestamp Integer / String 时间戳(毫秒),或 * 表示当前时间
addend Double 要加上的数值
RETENTION Integer 数据保留时间(毫秒)
ENCODING Enum 编码方式:COMPRESSED(默认)或 UNCOMPRESSED
CHUNK_SIZE Integer 数据块大小(字节)
DUPLICATE_POLICY Enum 重复时间戳策略
LABELS List 标签键值对
IGNORE List 忽略时间差和值差范围内的重复数据

*返回值

  • Integer:操作后的时间戳
  • Error:参数错误、键类型不匹配等

*时间复杂度

O(1)

*

*示例

*基本用法

> TS.CREATE counter:orders
OK
> TS.INCRBY counter:orders * 1
(integer) 1625235000000

*指定时间戳

> TS.INCRBY counter:orders 1625232000000 5
(integer) 1625232000000

*自动创建带标签

> TS.INCRBY counter:users * 1 LABELS service api env prod
(integer) 1625235000000

*常见错误

错误 原因 解决
TSDB: Error at add, update is not supported 重复时间戳且策略为 BLOCK 调整 DUPLICATE_POLICY
WRONGTYPE key 不是时间序列 检查 key 名

*最佳实践

  • 适用于计数器场景(订单数、访问量、错误数)
  • 使用 SUM 重复策略,确保同一时间点多次累加正确
  • 配合 TS.GET 获取最新计数值
  • 批量累加优先使用 TS.MADD 多个序列,或单个序列的多次 TS.INCRBY

*FAQ

Q1: TS.INCRBY 和 TS.ADD 的区别? A: TS.INCRBY 是对已有值的累加,适用于计数器;TS.ADD 是设置具体值,适用于原始数据写入。

Q2: 首次执行时初始值是多少? A: 如果序列中该时间戳无数据,addend 即为新值。

Q3: 重复时间戳会重复累加吗? A: 取决于 DUPLICATE_POLICY,SUM 会累加,LAST 会覆盖为最新值。