暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Redis每日一练(06):INCR、DECR、INCRBY、DECRBY、INCYBYFLOAT命令

原创 AlbertS 2019-12-09
4525

版权声明: 转载请注明出处!本文采用 知识共享 署名-非商业性使用-禁止演绎 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>

总结

  1. INCR 和 DECR、 INCRBY 和 DECRBY 两两配对,只有 INCRBYFLOAT 孤零零一个。
  2. 上述命令中,只有 INCRBYFLOAT 可以操作浮点数,其他的命令只能操作存储了整数的字符串。

2019-11-27 18:26:45

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论