Redis 基本命令:KEYS、EXISTS、TYPE、TTL
Redis 提供了一套基本命令,這些命令對于管理密鑰和了解數據庫中存儲的數據至關重要。這些命令雖然簡單,但提供了對 Redis 實例的結構和狀態的重要見解。具體來說,KEYS、``EXISTS、``TYPE
?和?TTL
?允許您檢查、驗證和管理數據的生命周期。掌握這些命令是高效使用 Redis 的基礎,并為更高級的作奠定了基礎。
了解 KEYS 命令
KEYS
?命令用于檢索與指定模式匹配的鍵。雖然功能強大,但了解其含義至關重要,尤其是在生產環境中。
語法和用法
KEYS
?命令的語法很簡單:
KEYS pattern
pattern
?參數是 glob 樣式的模式。以下是一些常見模式:
*
:匹配所有內容。h?llo
:匹配?hello
、hallo
?和?hxllo
。h*llo
:匹配?hllo
、heello
、hillo
?和?heeeello
。h[ae]llo
:匹配?hello
?和?hallo
,但不匹配?hillo
。h[^e]llo
:匹配?hallo
、hbllo
、…,但不匹配?hello
。h[a-b]llo
:匹配?hallo
?和?hbllo
。
例:
假設您的 Redis 數據庫中有以下鍵:user:1000
、user:1001
、user:1002
、product:1
、product:2
?和?session:123
。
KEYS user:*
?將返回?user:1000
、user:1001
?和?user:1002
。KEYS product:*
?將返回?product:1
?和?product:2
。KEYS *:*
?將返回上面列出的所有鍵。KEYS user:100?
?將返回?user:1000
、user:1001
?和?user:1002
。
性能注意事項
KEYS
?命令掃描整個密鑰空間,這在大型數據庫上可能非常慢。這可能會阻止其他作并降低性能。?避免在生產環境中使用?KEYS
。
選擇:
- SCAN:?使用?
SCAN
?命令,該命令提供了一種迭代方式來檢索密鑰。它返回一個游標,您可以使用該游標批量檢索鍵,從而最大限度地減少對性能的影響。我們將在后面的模塊中介紹?SCAN
。 - 集:?維護一個包含特定類型的所有鍵的單獨集。當您需要檢索這些鍵時,只需檢索集的成員即可。
- 鍵命名約定:?使用一致的鍵命名約定,以便更輕松地以編程方式識別和檢索鍵,而無需依賴模式匹配。
使用 SCAN 的示例(簡要介紹 - 后面的模塊中將詳細介紹):
您將迭代使用?SCAN
,而不是?KEYS *
:
SCAN 0 MATCH * COUNT 10
此命令返回一個光標和一個鍵列表。然后,您將在下一個?SCAN
?命令中使用返回的光標,直到光標為?0
,這表示您已經迭代了整個鍵空間。
實踐練習
- 將以下鍵添加到您的 Redis 數據庫:
user:1
、user:2
、product:1
、order:1
。 - 使用?
KEYS
?命令檢索以?user:
?開頭的所有密鑰。 - 使用?
KEYS
?命令檢索包含數字?1
?的所有鍵。 - 考慮如果您有數百萬個鍵的潛在性能影響。
了解 EXISTS 命令
EXISTS
?命令檢查 Redis 數據庫中是否存在鍵。如果鍵存在,則返回?1
,如果鍵不存在,則返回?0
。
語法和用法
EXISTS key [key ...]
您可以在單個命令中檢查是否存在多個鍵。
例:
SET mykey "Hello"
EXISTS mykey // Returns 1
EXISTS nonexistingkey // Returns 0
EXISTS mykey nonexistingkey // Returns 1 (because at least one key exists)
實際應用
- 條件操作:?在對密鑰執行作之前,使用?
EXISTS
?檢查密鑰是否存在。例如,您可能希望僅在用戶配置文件已存在時才更新該配置文件。 - 數據驗證:?在嘗試檢索鍵的值之前,請使用?
EXISTS
?驗證鍵是否存在。這可以防止錯誤并提高應用程序的穩健性。 - 緩存:?使用?
EXISTS
?檢查值是否已緩存,然后再從速度較慢的數據源中檢索該值。
示例:條件更新
if (redis.exists("user:123")) {// User exists, update their profileredis.hset("user:123", "name", "New Name");
} else {// User does not exist, create a new profileredis.hset("user:123", "name", "New User");
}
實踐練習
- 設置名為?
mykey
?的鍵,其值為?myvalue
。 - 使用?
EXISTS
?命令檢查?mykey
?是否存在。 - 使用?
EXISTS
?命令檢查是否存在名為?nonexistentkey
?的鍵。 - 使用?
EXISTS
?命令檢查?mykey
?和?nonexistentkey
?是否都存在。
了解 TYPE 命令
TYPE
?命令返回存儲在給定鍵中的數據類型。Redis 支持多種數據類型,包括:
string
list
set
zset
(排序集)hash
stream
如果密鑰不存在,則命令返回?none
。
語法和用法
TYPE key
例:
SET mykey "Hello"
TYPE mykey // Returns "string"LPUSH mylist "World"
TYPE mylist // Returns "list"SADD myset "Element"
TYPE myset // Returns "set"HSET myhash field value
TYPE myhash // Returns "hash"ZADD myzset 1.0 element
TYPE myzset // Returns "zset"TYPE nonexistingkey // Returns "none"
實際應用
- 數據驗證:?使用?
TYPE
?確保鍵在對鍵執行作之前包含預期的數據類型。這可以防止錯誤并確保數據完整性。 - 調試:?使用?
TYPE
?在調試 Redis 應用程序的問題時檢查鍵的數據類型。 - 多態運算:?在某些情況下,您可能希望根據鍵的數據類型執行不同的作。?
使用 TYPE
?命令可以實現這種多態行為。
示例:數據驗證
if (redis.type("mykey") == "string") {// Key is a string, perform string-specific operationsString value = redis.get("mykey");System.out.println("Value: " + value);
} else {// Key is not a string, handle the errorSystem.out.println("Error: Key is not a string");
}
實踐練習
- 設置一個名為?
mykey
?的鍵,字符串值為?myvalue
。 - 創建一個名為?
mylist
?的列表,其中包含元素?item1
?和?item2
。 - 創建一個名為?
myhash
?的哈希,其中包含字段?field1
?和?field2
?以及相應的值?value1
?和?value2
。 - 使用?
TYPE
?命令確定?mykey
、mylist
、myhash
?和不存在的密鑰的數據類型。
了解 TTL 命令
TTL
?(Time To Live) 命令返回具有關聯到期時間的密鑰的剩余生存時間 (以秒為單位)。
語法和用法
TTL key
返回值:
- 正整數:?剩余生存時間(以秒為單位)。
- -1:?密鑰存在,但沒有關聯的過期時間。
- -阿拉伯數字:?密鑰不存在。
例:
SET mykey "Hello" EX 10 // Set key with 10-second expiration
TTL mykey // Returns a value between 0 and 10 (depending on how much time has passed)TTL nonexistingkey // Returns -2SET anotherkey "World"
TTL anotherkey // Returns -1
實際應用
- 緩存管理:?使用?
TTL
?監控緩存數據的過期時間,并根據需要刷新緩存。 - 會話管理:?使用?
TTL
?跟蹤用戶會話的過期時間,并在用戶處于非活動狀態一段時間后自動注銷。 - 速率限制:?將?
TTL
?與其他命令結合使用以實現速率限制機制。
示例:緩存刷新
if (redis.ttl("cached_data") < 60) {// Cache is about to expire, refresh itString data = retrieveDataFromDatabase();redis.setex("cached_data", 3600, data); // Set with 1-hour expiration
}
修改過期時間
- EXPIRE 密鑰秒:?將 key 的過期時間設置為指定的秒數。
- PEXPIRE 密鑰毫秒:?將 key 的過期時間設置為指定的毫秒數。
- PERSIST 鍵:?刪除密鑰的過期時間,使其持久化。
例:
SET mykey "Hello"
EXPIRE mykey 60 // Set expiration to 60 seconds
TTL mykey // Returns a value between 0 and 60PERSIST mykey
TTL mykey // Returns -1
實踐練習
- 設置一個名為?
mykey
?的鍵,其值為?myvalue
,有效期為 30 秒。 - 使用?
TTL
?命令檢查?mykey
?的剩余生存時間。 - 使用?
EXPIRE
?命令將?mykey
?的過期時間再延長 60 秒。 - 使用?
PERSIST
?命令從?mykey
?中刪除過期時間。 - 驗證?
TTL
?命令現在是否為?mykey
?返回 -1。
這些基本命令是與 Redis 交互的基本構建塊。了解如何有效地使用它們將使您能夠更有效地管理數據并構建強大的應用程序。