字符串操作:INCR、DECR、APPEND
Redis 字符串不仅仅是简单的文本,它们还可以表示数字。此功能使我们能够直接对存储在 Redis 中的字符串值执行原子的递增和递减操作。此外,Redis 还提供了一种附加到现有字符串的方法,从而可以轻松构建更大的文本值。这些操作对于计数器、速率限制和动态字符串构造等任务至关重要。
增加字符串:INCR 命令
Redis 中的 INCR
命令用于递增字符串键的整数值。如果该键不存在,则在执行递增操作之前将其设置为“0”。如果键包含错误类型的值(例如,无法解释为整数的字符串)或表示非整数的字符串,则会返回错误。递增操作是原子的,这意味着即使多个客户端同时尝试递增同一个键,该操作也将正确执行,而不会出现任何竞争条件。
INCR 的基本用法
最简单的用例是增加计数器。想象一下,你正在跟踪某个网页的访问次数。
> SET page_views 10
OK
> INCR page_views
(integer) 11
> GET page_views
"11"
在此示例中,我们首先将 page_views
键设置为“10”。然后,我们使用 INCR
命令递增其值。该命令返回新值 (11),后续的 GET
命令确认该值已在 Redis 中更新。
如果键不存在, INCR
会将其初始化为 0,然后将其增加为 1:
> DEL new_key
(integer) 0
> INCR new_key
(integer) 1
> GET new_key
"1"
使用 INCR 进行错误处理
如果您尝试增加包含非数字字符串的键,Redis 将返回错误:
> SET my_string "hello"
OK
> INCR my_string
(error) ERR value is not an integer or out of range
类似地,尝试增加以字符串形式存储的浮点数也会导致错误:
> SET float_value "3.14"
OK
> INCR float_value
(error) ERR value is not an integer or out of range
INCRBY:按特定值递增
Redis 还提供了 INCRBY
命令,允许你将键的值增加特定的整数值。当你需要增加的数值大于 1 时,这个命令非常有用。
> SET score 50
OK
> INCRBY score 25
(integer) 75
> GET score
"75"
在这里,我们将 score
键增加 25,得到新值 75。
实际示例:速率限制
INCR
的一个常见用例是速率限制。您可以使用它来限制用户在特定时间范围内对 API 发出的请求数量。
- 为每个用户设置一个密钥,例如
user:123:requests
。 - 当用户提出请求时,对密钥
INCR
。 - 使用
EXPIRE
在键上设置生存时间 (TTL),代表时间窗口。 - 如果密钥的值超过某个阈值,则拒绝请求。
> SET user:123:requests 0
OK
> INCR user:123:requests
(integer) 1
> EXPIRE user:123:requests 60 # Expire in 60 seconds
(integer) 1
> INCR user:123:requests
(integer) 2
如果 INCR
命令返回的值大于您的限制,您可以拒绝该请求。密钥将在 60 秒后自动过期,并重置计数器。
减少字符串:DECR 命令
DECR
命令与 INCR
相对应。它将字符串键的整数值减一。与 INCR
类似,如果键不存在,则在减一之前将其设置为 0。如果键包含错误类型的值,它也会返回错误。
DECR 的基本用法
> SET items_left 100
OK
> DECR items_left
(integer) 99
> GET items_left
"99"
在这个例子中,我们从 100 个项目开始,然后使用 DECR
减少计数。
如果键不存在, DECR
会将其初始化为 0,然后将其递减为 -1:
> DEL another_key
(integer) 0
> DECR another_key
(integer) -1
> GET another_key
"-1"
使用 DECR 进行错误处理
DECR
在错误处理方面与 INCR
类似。如果值不是整数,它将返回错误。
> SET my_string "world"
OK
> DECR my_string
(error) ERR value is not an integer or out of range
DECRBY:按特定值递减
DECRBY
命令允许您将键减少特定的整数值,类似于 INCRBY
。
> SET energy 80
OK
> DECRBY energy 30
(integer) 50
> GET energy
"50"
在这里,我们将 energy
键减少 30,得到新值 50。
实际示例:库存管理
DECR
可用于库存管理系统。每次售出一件商品时,您可以减少库存数量。
> SET product:123:stock 500
OK
> DECRBY product:123:stock 1 # One item sold
(integer) 499
> GET product:123:stock
"499"
您还可以检查库存水平是否低于某个阈值并触发重新订购流程。
附加到字符串:APPEND 命令
APPEND
命令用于将字符串附加到键所存储的值的末尾。如果该键不存在,则在附加操作之前将其创建为空字符串。
APPEND 的基本用法
> SET greeting "Hello"
OK
> APPEND greeting ", world!"
(integer) 13
> GET greeting
"Hello, world!"
在此示例中,我们以字符串“Hello”开头,并在其后附加“world!”。 APPEND
命令返回字符串的新长度 (13)。
如果键不存在, APPEND
会将其创建为空字符串,然后附加值:
> DEL non_existent_key
(integer) 0
> APPEND non_existent_key "Redis"
(integer) 5
> GET non_existent_key
"Redis"
实际示例:构建日志消息
APPEND
对于构建日志消息或随时间累积数据很有用。
> APPEND log:2024-01-26 "Request received at 10:00:00\n"
(integer) 27
> APPEND log:2024-01-26 "Request processed at 10:00:01\n"
(integer) 54
> GET log:2024-01-26
"Request received at 10:00:00\nRequest processed at 10:00:01\n"
每次发生事件时,您都可以在日志消息中附加一个新行。
将 APPEND 与其他命令结合使用
你可以将 APPEND
与其他字符串命令结合使用,以执行更复杂的操作。例如,你可以使用 GETRANGE
(将在后续模块中介绍,但为了完整性起见,在此仅提及)来提取附加字符串的一部分。