Redis 提供了一套基本命令,这些命令对于管理密钥和了解数据库中存储的数据至关重要。这些命令虽然简单,但提供了对 Redis 实例的结构和状态的重要见解。具体来说,KEYS、``EXISTS、``TYPE
和 TTL
允许您检查、验证和管理数据的生命周期。掌握这些命令是高效使用 Redis 的基础,并为更高级的作奠定了基础。
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
,而不是 KEYS *
:
SCAN 0 MATCH * COUNT 10
此命令返回一个光标和一个键列表。然后,您将在下一个 SCAN
命令中使用返回的光标,直到光标为 0
,这表示您已经迭代了整个键空间。
user:1
、user:2
、product:1
、order:1
。KEYS
命令检索以 user:
开头的所有密钥。KEYS
命令检索包含数字 1
的所有键。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 profile
redis.hset("user:123", "name", "New Name");
} else {
// User does not exist, create a new profile
redis.hset("user:123", "name", "New User");
}
mykey
的键,其值为 myvalue
。EXISTS
命令检查 mykey
是否存在。EXISTS
命令检查是否存在名为 nonexistentkey
的键。EXISTS
命令检查 mykey
和 nonexistentkey
是否都存在。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 operations
String value = redis.get("mykey");
System.out.println("Value: " + value);
} else {
// Key is not a string, handle the error
System.out.println("Error: Key is not a string");
}
mykey
的键,字符串值为 myvalue
。mylist
的列表,其中包含元素 item1
和 item2
。myhash
的哈希,其中包含字段 field1
和 field2
以及相应的值 value1
和 value2
。TYPE
命令确定 mykey
、mylist
、myhash
和不存在的密钥的数据类型。TTL
(Time To Live) 命令返回具有关联到期时间的密钥的剩余生存时间 (以秒为单位)。
TTL key
返回值:
例:
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 -2
SET anotherkey "World"
TTL anotherkey // Returns -1
TTL
监控缓存数据的过期时间,并根据需要刷新缓存。TTL
跟踪用户会话的过期时间,并在用户处于非活动状态一段时间后自动注销。TTL
与其他命令结合使用以实现速率限制机制。示例:缓存刷新
if (redis.ttl("cached_data") < 60) {
// Cache is about to expire, refresh it
String data = retrieveDataFromDatabase();
redis.setex("cached_data", 3600, data); // Set with 1-hour expiration
}
例:
SET mykey "Hello"
EXPIRE mykey 60 // Set expiration to 60 seconds
TTL mykey // Returns a value between 0 and 60
PERSIST mykey
TTL mykey // Returns -1
mykey
的键,其值为 myvalue
,有效期为 30 秒。TTL
命令检查 mykey
的剩余生存时间。EXPIRE
命令将 mykey
的过期时间再延长 60 秒。PERSIST
命令从 mykey
中删除过期时间。TTL
命令现在是否为 mykey
返回 -1。这些基本命令是与 Redis 交互的基本构建块。了解如何有效地使用它们将使您能够更有效地管理数据并构建强大的应用程序。