*Redis TS.DECRBY 命令

TS.DECRBY 对时间序列中指定时间戳的值执行减法操作,等效于 TS.INCRBY 的负数形式。


*语法

TS.DECRBY key timestamp subtrahend [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 时间戳(毫秒),或 * 表示当前时间
subtrahend 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.DECRBY counter:orders * 5
(integer) 1625235000000

*指定时间戳

> TS.DECRBY counter:orders 1625232000000 10
(integer) 1625232000000

*自动创建带标签

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

*常见错误

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

*最佳实践

  • 适用于计数器递减场景(如库存减少、取消订单)
  • TS.INCRBY 配合使用,实现双向计数
  • 使用 SUM 重复策略,确保计数器幂等性

*FAQ

Q1: TS.DECRBY 和 TS.INCRBY 的关系? A: TS.DECRBY key t v 等效于 TS.INCRBY key t -v。

Q2: 值可以减到负数吗? A: 可以,RedisTimeSeries 不限制值的范围。

Q3: 重复时间戳会重复减吗? A: 取决于 DUPLICATE_POLICY,SUM 会累加(即再减一次),LAST 会覆盖。