2.13 INCRBY、DECRBY:对整数值执行加法操作和减法操作
当字符串键存储的值能够被Redis解释为整数时,用户就可以通过INCRBY命令和DECRBY命令对被存储的整数值执行加法或减法操作。
INCRBY命令用于为整数值加上指定的整数增量,并返回键在执行加法操作之后的值:
INCRBY key increment
以下代码展示了如何使用INCRBY命令去增加一个字符串键的值:
redis> SET number 100 OK redis> GET number "100" redis> INCRBY number 300 -- 将键的值加上300 (integer) 400 redis> INCRBY number 256 -- 将键的值加上256 (integer) 656 redis> INCRBY number 1000 -- 将键的值加上1000 (integer) 1656 redis> GET number "1656"
与INCRBY命令的作用正好相反,DECRBY命令用于为整数值减去指定的整数减量,并返回键在执行减法操作之后的值:
DECRBY key increment
以下代码展示了如何使用DECRBY命令去减少一个字符串键的值:
redis> SET number 10086 OK redis> GET number "10086" redis> DECRBY number 300 -- 将键的值减去300 (integer) 9786 redis> DECRBY number 786 -- 将键的值减去786 (integer) 9000 redis> DECRBY number 5500 -- 将键的值减去5500 (integer) 3500 redis> GET number "3500"
2.13.1 类型限制
当字符串键的值不能被Redis解释为整数时,对键执行INCRBY命令或是DECRBY命令将返回一个错误:
redis> SET pi 3.14 OK redis> INCRBY pi 100 -- 不能对浮点数值执行 (error) ERR value is not an integer or out of range redis> SET message "hello world" OK redis> INCRBY message -- 不能对字符串值执行 (error) ERR wrong number of arguments for 'incrby' command redis> SET big-number 123456789123456789123456789 OK redis> INCRBY big-number 100 -- 不能对超过64位长度的整数执行 (error) ERR value is not an integer or out of range
另外需要注意的一点是,INCRBY和DECRBY的增量和减量也必须能够被Redis解释为整数,使用其他类型的值作为增量或减量将返回一个错误:
redis> INCRBY number 3.14 -- 不能使用浮点数作为增量 (error) ERR value is not an integer or out of range redis> INCRBY number "hello world" -- 不能使用字符串值作为增量 (error) ERR value is not an integer or out of range
2.13.2 处理不存在的键
当INCRBY命令或DECRBY命令遇到不存在的键时,命令会先将键的值初始化为0,然后再执行相应的加法操作或减法操作。
以下代码展示了INCRBY命令是如何处理不存在的键x的:
redis> GET x -- 键x不存在 (nil) redis> INCRBY x 123 -- 先将键x的值初始化为0,然后再执行加上123的操作 (integer) 123 redis> GET x "123"
以下代码展示了DECRBY命令是如何处理不存在的键y的:
redis> GET y -- 键y不存在 (nil) redis> DECRBY y 256 -- 先将键y的值初始化为0,再执行减去256的操作 (integer) -256 redis> GET y "-256"
2.13.3 其他信息
复杂度:O(1)。
版本要求:INCRBY命令和DECRBY命令从Redis 1.0.0开始可用。