*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 会覆盖为最新值。