redis数据结构-02(INCR、DECR、APPEND)

字符串操作: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 发出的请求数量。

  1. 为每个用户设置一个密钥,例如 user:123:requests

  2. 当用户提出请求时,对密钥 INCR

  3. 使用 EXPIRE 在键上设置生存时间 (TTL),代表时间窗口。

  4. 如果密钥的值超过某个阈值,则拒绝请求。

    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 (将在后续模块中介绍,但为了完整性起见,在此仅提及)来提取附加字符串的一部分。

相关推荐
Adios7949 分钟前
设置交集大小至少为2
数据结构·算法·leetcode
流星白龙37 分钟前
【Redis】2.Redis重大版本
数据库·redis·junit
流星白龙38 分钟前
【Redis】7.Hash表
数据库·redis·哈希算法
流星白龙2 小时前
【Redis】4.基本全局命令
数据库·redis·缓存
流星白龙5 小时前
【Redis】3.Redis安装与命令行客户端
数据库·redis·缓存
来一碗刘肉面7 小时前
栈的应用(表达式求值)
数据结构·算法
Season4509 小时前
Redis命令 (generic即通用命令)
数据库·redis·bootstrap
yuannl109 小时前
图的深度优先遍历DFS
数据结构
我不想名字重复10 小时前
redis缓存和数据库数据保持一致
数据库·redis·缓存
青山木12 小时前
Hot 100 --- 岛屿数量
java·数据结构·算法·leetcode·深度优先·广度优先