Redis DECR 命令
语法
1 | DECR key |
可用版本
≥ 1.0.0
时间复杂度
$O(1)$
ACL 类别
@write
, @string
, @fast
将存储在 key
的数字值减 1。如果 key
不存在,则先将 key
的值初始化为 0,然后再执行 DECR
操作。如果 key
包含一个错误类型的值或包含一个不能表示为整数的字符串,则返回错误。这个操作仅限于 64 位有符号的整数。
返回值
返回一个整数,表示执行 DECR
操作后,key
对应的值。
示例 1
以下示例演示了当对一个不存在的键执行 DECR
操作时,Redis 会先为该键创建一个初始值为 0 的值,然后再执行减一操作。
- 使用
EXISTS
命令检查foo
键是否存在,返回 0,表示键不存在。 - 然后使用
DECR
命令对foo
键执行减一操作。由于键不存在,DECR
命令会先为foo
键创建一个值,并将其设置为 0,然后再对其执行减一操作,使值变为 -1。DECR
返回 -1。 - 接着使用
GET
命令获取foo
的值,返回"-1"
。 - 再次使用
DECR
命令对foo
执行减一操作,使其值变为 -2。DECR
返回 -2。 - 至此,
foo
键的值变为 -2。
1 | redis> EXISTS foo |
示例 2
以下示例演示了Redis 的 DECR
命令要求键的值必须是整数,才能正确执行减一操作。如果键的值是字符串,则会返回错误。
- 首先使用
SET
命令将name
键的值设置为字符串"johnson"
。SET
命令返回 OK,表示设置成功。 - 然后使用
GET
命令获取name
键的值,返回"johnson"
。 - 接着试图使用
DECR
命令对name
键执行减一操作。由于name
键的值是不能表示为整数的字符串,所以DECR
命令返回(error) ERR value is not an integer or out of range
错误,表示该值不是整数,无法执行减一操作。 - 因为
DECR
命令要求键的值必须是整数,才能对其执行减一操作。而name
键的值是字符串"johnson"
,所以无法使用DECR
命令减一,从而导致错误。
1 | redis> SET name johnson |
示例 3
以下示例演示了对 Redis 中最小 64 位有符号整数值进行减一操作会导致整数溢出,从而返回错误,操作失败。
- 首先使用
SET
命令将foo
键的值设置为整数 -9223372036854775807,这是 64 位带符号整数能表示的次最小值。SET
命令返回 OK,表示设置成功。 - 然后使用
DECR
命令对foo
键执行减一操作。返回 -9223372036854775808,这是 64 位带符号整数的最小值。 - 接着再次使用
DECR
命令试图对foo
键执行减一操作。但是,由于键的值已经是最小的 64 位有符号整数,再减一会导致整数溢出,所以DECR
命令返回(error) ERR increment or decrement would overflow
错误,表示DECR
操作会导致整数溢出。 - 由于整数的范围限制,对 64 位有符号整数最小值进行减一操作会导致溢出,所以 Redis 返回错误,拒绝执行该操作。
1 | redis> SET foo -9223372036854775807 |
64 位有符号整数的数值范围:[-9223372036854775808, 9223372036854775807]
(END)
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.