语法

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 的值,然后再执行减一操作。

  1. 使用 EXISTS 命令检查 foo 键是否存在,返回 0,表示键不存在。
  2. 然后使用 DECR 命令对 foo 键执行减一操作。由于键不存在,DECR 命令会先为 foo 键创建一个值,并将其设置为 0,然后再对其执行减一操作,使值变为 -1。DECR 返回 -1。
  3. 接着使用 GET 命令获取 foo 的值,返回 "-1"
  4. 再次使用 DECR 命令对 foo 执行减一操作,使其值变为 -2。DECR 返回 -2。
  5. 至此,foo 键的值变为 -2。
1
2
3
4
5
6
7
8
9
redis> EXISTS foo
(integer) 0
redis> DECR foo
(integer) -1
redis> GET foo
"-1"
redis> DECR foo
(integer) -2
redis>

示例 2

以下示例演示了Redis 的 DECR 命令要求键的值必须是整数,才能正确执行减一操作。如果键的值是字符串,则会返回错误。

  1. 首先使用 SET 命令将 name 键的值设置为字符串 "johnson"SET 命令返回 OK,表示设置成功。
  2. 然后使用 GET 命令获取 name 键的值,返回 "johnson"
  3. 接着试图使用 DECR 命令对 name 键执行减一操作。由于 name 键的值是不能表示为整数的字符串,所以 DECR 命令返回 (error) ERR value is not an integer or out of range 错误,表示该值不是整数,无法执行减一操作。
  4. 因为 DECR 命令要求键的值必须是整数,才能对其执行减一操作。而 name 键的值是字符串 "johnson",所以无法使用 DECR 命令减一,从而导致错误。
1
2
3
4
5
6
7
redis> SET name johnson
OK
redis> GET name
"johnson"
redis> DECR name
(error) ERR value is not an integer or out of range
redis>

示例 3

以下示例演示了对 Redis 中最小 64 位有符号整数值进行减一操作会导致整数溢出,从而返回错误,操作失败。

  1. 首先使用 SET 命令将 foo 键的值设置为整数 -9223372036854775807,这是 64 位带符号整数能表示的次最小值。SET 命令返回 OK,表示设置成功。
  2. 然后使用 DECR 命令对 foo 键执行减一操作。返回 -9223372036854775808,这是 64 位带符号整数的最小值。
  3. 接着再次使用 DECR 命令试图对 foo 键执行减一操作。但是,由于键的值已经是最小的 64 位有符号整数,再减一会导致整数溢出,所以 DECR 命令返回 (error) ERR increment or decrement would overflow 错误,表示 DECR 操作会导致整数溢出。
  4. 由于整数的范围限制,对 64 位有符号整数最小值进行减一操作会导致溢出,所以 Redis 返回错误,拒绝执行该操作。
1
2
3
4
5
6
7
redis> SET foo -9223372036854775807
OK
redis> DECR foo
(integer) -9223372036854775808
redis> DECR foo
(error) ERR increment or decrement would overflow
redis>

64 位有符号整数的数值范围:[-9223372036854775808, 9223372036854775807]

(END)