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.


