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

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

        INCRBYFLOAT key increment

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

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

        redis> SET decimal 3.14              -- 一个存储着浮点数值的键
        OK

       redis> GET decimal
        "3.14"

       redis> INCRBYFLOAT decimal 2.55     -- 将键decimal的值加上2.55
        "5.69"

       redis> GET decimal
        "5.69"

2.15.1 处理不存在的键

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

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

        redis> GET x-point     -- 不存在的键
        (nil)

       redis> INCRBYFLOAT x-point 12.7829
        "12.7829"

       redis> GET x-point
        "12.7829"

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

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

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

        redis> SET pi 3.14
        OK
        redis> GET pi
        "3.14"

       redis> INCRBYFLOAT pi -1.1     -- 值减去1.1
        "2.04"

       redis> INCRBYFLOAT pi -0.7     -- 值减去0.7
        "1.34"

       redis> INCRBYFLOAT pi -1.3     -- 值减去1.3
        "0.04"

2.15.3 INCRBYFLOAT与整数值

INCRBYFLOAT命令对于类型限制的要求比INCRBY命令和INCR命令要宽松得多:

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

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

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

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

        redis> SET pi 1                  -- 创建一个整数值
        OK

       redis> GET pi
        "1"

       redis> INCRBYFLOAT pi 2.14
        "3.14"

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

        redis> SET pi 3.14
        OK

       redis> GET pi
        "3.14"

       redis> INCRBYFLOAT pi 20       -- 增量为整数值
        "23.14"

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

        redis> SET pi 3.14
        OK

       redis> GET pi
        "3.14"

       redis> INCRBYFLOAT pi 0.86     -- 计算结果被存储为整数
        "4"

2.15.4 小数位长度限制

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

        redis> GET i
        "0.01234567890123456789"     -- 这个数字的小数部分有20位长

       redis> INCRBYFLOAT i 0
        "0.01234567890123457"        -- 执行加法操作之后,小数部分只保留了17

2.15.5 其他信息

复杂度:O(1)。

版本要求:INCRBYFLOAT命令从Redis 2.6.0开始可用。