字符串操作: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
?(將在后續模塊中介紹,但為了完整性起見,在此僅提及)來提取附加字符串的一部分。