INCRBYFLOAT:对数字值执行浮点数加法操作

除了用于执行整数加法操作的 INCR 命令以及 INCRBY 命令之外,Redis 还提供了用于执行浮点数加法操作的 INCRBYFLOAT 命令:

  1. INCRBYFLOAT key increment

INCRBYFLOAT 命令可以把一个浮点数增量加到字符串键储存的数字值上面,并返回键在执行加法操作之后的数字值作为命令的返回值。

以下代码展示了如何使用 INCRBYFLOAT 命令去增加一个浮点数的值:

  1. redis> SET decimal 3.14 -- 一个储存着浮点数值的键
  2. OK
  3.  
  4. redis> GET decimal
  5. "3.14"
  6.  
  7. redis> INCRBYFLOAT decimal 2.55 -- 将键 decimal 的值加上 2.55
  8. "5.69"
  9.  
  10. redis> GET decimal
  11. "5.69"

处理不存在的键

INCRBYFLOAT 命令在遇到不存在的键时,会先将键的值初始化为 0 ,然后再执行相应的加法操作。

在以下展示的代码里面,INCRBYFLOAT 命令就是先把 x-point 键的值初始化为 0 ,然后再执行加法操作的:

  1. redis> GET x-point -- 不存在的键
  2. (nil)
  3.  
  4. redis> INCRBYFLOAT x-point 12.7829
  5. "12.7829"
  6.  
  7. redis> GET x-point
  8. "12.7829"

使用 INCRBYFLOAT 执行浮点数减法操作

Redis 为 INCR 命令提供了相应的减法版本 DECR 命令,也为 INCRBY 命令提供了相应的减法版本 DECRBY 命令,但是并没有为 INCRBYFLOAT 命令提供相应的减法版本,因此用户只能通过给 INCRBYFLOAT 命令传入负数增量来执行浮点数减法操作。

以下代码展示了如何使用 INCRBYFLOAT 命令执行浮点数减法计算:

  1. redis> SET pi 3.14
  2. OK
  3.  
  4. redis> GET pi
  5. "3.14"
  6.  
  7. redis> INCRBYFLOAT pi -1.1 -- 值减去 1.1
  8. "2.04"
  9.  
  10. redis> INCRBYFLOAT pi -0.7 -- 值减去 0.7
  11. "1.34"
  12.  
  13. redis> INCRBYFLOAT pi -1.3 -- 值减去 1.3
  14. "0.04"

INCRBYFLOAT 与整数值

INCRBYFLOAT 命令对于类型限制的要求比 INCRBY 命令和 INCR 命令要宽松得多,INCRBYFLOAT 命令不仅可以用于处理浮点数值,它还可以用于处理整数值:

  • INCRBYFLOAT 命令既可用于浮点数值,也可以用于整数值。

  • INCRBYFLOAT 命令的增量既可以是浮点数,又可以是整数。

  • INCRBYFLOAT 命令的执行结果可以表示为整数时,命令的执行结果将以整数形式储存。

以下代码展示了如何使用 INCRBYFLOAT 去处理一个储存着整数值的键:

  1. redis> SET pi 1 -- 创建一个整数值
  2. OK
  3.  
  4. redis> GET pi
  5. "1"
  6.  
  7. redis> INCRBYFLOAT pi 2.14
  8. "3.14"

以下代码展示了如何使用整数值作为 INCRBYFLOAT 命令的增量:

  1. redis> SET pi 3.14
  2. OK
  3.  
  4. redis> GET pi
  5. "3.14"
  6.  
  7. redis> INCRBYFLOAT pi 20 -- 增量为整数值
  8. "23.14"

而以下代码则展示了 INCRBYFLOAT 命令是如何把计算结果储存为整数的:

  1. redis> SET pi 3.14
  2. OK
  3.  
  4. redis> GET pi
  5. "3.14"
  6.  
  7. redis> INCRBYFLOAT pi 0.86 -- 计算结果被储存为整数
  8. "4"

小数位长度限制

虽然 Redis 并不限制字符串键储存的浮点数的小数位长度,但是在使用 INCRBYFLOAT 命令处理浮点数的时候,命令最多只会保留计算结果小数点后的 17 位数字,超过这个范围的小数将被截断:

  1. redis> GET i
  2. "0.01234567890123456789" -- 这个数字的小数部分有 20 位长
  3.  
  4. redis> INCRBYFLOAT i 0
  5. "0.01234567890123457" -- 执行加法操作之后,小数部分只保留了 17

其他信息

属性
复杂度O(1)
版本要求INCRBYFLOAT 命令从 Redis 2.6.0 开始可用。