版权声明: 转载请注明出处!本文采用 知识共享 署名-非商业性使用-禁止演绎 4.0 国际许可协议
前言
今天要学习的命令稍微多一点,都和数字相关,是用来的控制数值增加或减少的,其中 INCR 和 DECR 是一对,INCRBY 和 DECRBY 是一对,唯独 INCRBYFLOAT 是孤零零的一个人,也不知道redis是咋想的,给它配套一个 DECRBYFLOAT 怎么了?
其实 “DECRBYFLOAT” 可以通过 INCRBYFLOAT 和负数参数实现,这可能是不实现 DECRBYFLOAT 的原因,但是如果是这个理由那 DECRBY 也可以通过 INCRBY 和负数参数实现,为啥人家成双入对的,可能是 DECRBY 后台比较硬吧。
INCR
- 最早出现版本:1.0.0
- 时间复杂度:O(1)
- 命令参数:INCR key
- 操作类型:strings
- 官方文档
作用
对一个字符串代表的整数进行加1操作,如果指定的键不存在,则默认为0再加1,如果指定的键不是整数或者不能转化成整数则报错,如果正常操作返回的是操作后的值,正常的整数代表是8个字节的整数范围。
练习
先给一个不存在的键调用 INCR 命令发现返回的是1,然后在给一个正常的存储整数的键使用 INCR 命令加1:
127.0.0.1:6379> GET age
(nil)
127.0.0.1:6379> INCR age
(integer) 1
127.0.0.1:6379> GET age
"1"
127.0.0.1:6379> SET age 18
OK
127.0.0.1:6379> INCR age
(integer) 19
127.0.0.1:6379> GET age
"19"
127.0.0.1:6379>
给不是整数的键使用 INCR 会报错:
127.0.0.1:6379> SET name albert
OK
127.0.0.1:6379> INCR name
(error) ERR value is not an integer or out of range
127.0.0.1:6379> SET weight 60.1
OK
127.0.0.1:6379> INCR weight
(error) ERR value is not an integer or out of range
127.0.0.1:6379>
DECR
- 最早出现版本:1.0.0
- 时间复杂度:O(1)
- 命令参数:DECR key
- 操作类型:strings
- 官方文档
作用
对一个字符串代表的整数进行减1操作,如果指定的键不存在,则默认为0再减1,如果指定的键不是整数或者不能转化成整数则报错,正常的整数范围是8个字节代表的整数范围,命令正常运行后会返回操作完成的值。
练习
先给一个不存在的键调用 DECR 命令发现返回的是-1,然后在给一个正常的存储整数的键使用 INCR 命令发现可以减1,因为没有参数,所有 DECR 不能通过 INCR 配合参数来实现:
27.0.0.1:6379> GET age
(nil)
127.0.0.1:6379> DECR age
(integer) -1
127.0.0.1:6379> SET age 18
OK
127.0.0.1:6379> DECR age
(integer) 17
127.0.0.1:6379> GET age
"17"
127.0.0.1:6379>
给不是整数的键使用 INCR 会报错:
127.0.0.1:6379> SET weight 60.2
OK
127.0.0.1:6379> DECR weight
(error) ERR value is not an integer or out of range
127.0.0.1:6379>
INCRBY
- 最早出现版本:1.0.0
- 时间复杂度:O(1)
- 命令参数:INCRBY key increment
- 操作类型:strings
- 官方文档
作用
这个命令相当于 INCR 命令的扩展,相当于给 INCR 命令加了一个整型参数,注意这个参数的类型可以是负整数,但是不能是小数,返回值是操作完成键对应的值。
练习
操作一个存在的键,在原有的基础上加一个整数,返回正常值,加一个小数返回错误:
127.0.0.1:6379> SET age 18
OK
127.0.0.1:6379> INCRBY age 2
(integer) 20
127.0.0.1:6379> GET age
"20"
127.0.0.1:6379> INCRBY age 1.1
(error) ERR value is not an integer or out of range
127.0.0.1:6379>
DECRBY
- 最早出现版本:1.0.0
- 时间复杂度:O(1)
- 命令参数:DECRBY key increment
- 操作类型:strings
- 官方文档
作用
这个命令与 INCRBY 命令是相反的操作,注意事项也相同,就是可以给一个整数减掉指定参数的大小的整数,返回操作后键对应的值,唯一疑惑的是这个命令可以被 INCRBY 代替,为啥又单独搞出来一个,如果为了方便,为啥不好事全成双,再加个 DECRBYFLOAT,迷糊!
练习
操作一个存在的键,在原有的基础上减掉3,返回正常值,减一个小数返回错误:
127.0.0.1:6379> GET age
"20"
127.0.0.1:6379> DECRBY age 3
(integer) 17
127.0.0.1:6379> DECRBY age 1.1
(error) ERR value is not an integer or out of range
127.0.0.1:6379>
INCRBYFLOAT
- 最早出现版本:2.6.0
- 时间复杂度:O(N)
- 命令参数:INCRBYFLOAT key increment
- 操作类型:strings
- 官方文档
作用
这个命令与 INCRBY 基本上一样,只是原来的键值和参数都可以是浮点数,同样可以是负数,可以实现减法操作,可以用3.0e2科学计数法的表示浮点数。
练习
给一个存储了浮点数字符串类型的键增加一个数,然后减少一个科学计数法表示的数:
127.0.0.1:6379> SET length 1000.5
OK
127.0.0.1:6379> GET length
"1000.5"
127.0.0.1:6379> INCRBYFLOAT length 400
"1400.5"
127.0.0.1:6379> INCRBYFLOAT length -3.0e2
"1100.5"
127.0.0.1:6379> GET length
"1100.5"
127.0.0.1:6379>
总结
- INCR 和 DECR、 INCRBY 和 DECRBY 两两配对,只有 INCRBYFLOAT 孤零零一个。
- 上述命令中,只有 INCRBYFLOAT 可以操作浮点数,其他的命令只能操作存储了整数的字符串。
2019-11-27 18:26:45