*Redis INCRBYFLOAT 命令
INCRBYFLOAT 将键的浮点数值增加指定的增量(increment)。如果键不存在,先将其设置为 0 再执行增加。
*语法
INCRBYFLOAT key increment
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| key | String | 是 | 键名,存储的值为数字字符串 |
| increment | Double | 是 | 增量值,支持整数、浮点数、科学计数法 |
*返回值
- String:增加后的新值(以字符串形式返回)
- Error:键值不是有效数字字符串、增量不是有效数字、结果超出双精度浮点范围
*时间复杂度
O(1)
*
*示例
*基本用法
> SET mykey 10.50
OK
> INCRBYFLOAT mykey 0.5
"11"
> INCRBYFLOAT mykey -0.5
"10.5"
*键不存在
> INCRBYFLOAT newkey 3.14
"3.14"
*科学计数法
> INCRBYFLOAT mykey 1.0e2
"110.5"
> INCRBYFLOAT mykey -1.5e1
"95.5"
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| ERR value is not a valid float | 键值不是有效数字 | 确保键存储的是数字字符串 |
| ERR increment is not a valid float | increment 不是有效数字 | 传入有效的浮点数字符串 |
| ERR increment would produce NaN or Infinity | 计算结果溢出 | 检查数值范围,双精度浮点数最大约 ±1.8e308 |
| WRONGTYPE Operation against a key holding the wrong kind of value | key 不是字符串类型 | 仅对 String 类型有效(存储数字) |
*最佳实践
- 适用于金额、评分、温度等需要浮点精度的场景
- 内部使用 IEEE 754 双精度浮点数(64 位),精度约 15-17 位有效数字,不适合要求严格十进制精度的金融场景(如货币计算建议使用整数分/厘存储 + INCR)
- 返回值为字符串形式,客户端需自行转换为浮点数
- 不支持设置过期时间,如需 TTL 应配合 EXPIRE 使用
*FAQ
Q1: INCRBYFLOAT 和 INCR 有什么区别? A: INCR 只能对整数值进行 +1 操作;INCRBYFLOAT 支持浮点增量和负值(即减量)。INCR 返回整数,INCRBYFLOAT 返回字符串形式的浮点数。
Q2: 浮点精度会丢失吗? A: 会。内部使用二进制浮点表示,某些十进制小数(如 0.1、0.2)无法精确表示。对精度敏感的场景,建议用整数存储最小单位(如分、厘)。
Q3: INCRBYFLOAT 可以同时设置 TTL 吗? A: 不可以,INCRBYFLOAT 本身不支持时间选项。如果需要过期时间,应在其后发送 EXPIRE / PEXPIRE 命令。