文档:键空间

Valkey 的键是二进制安全的;这意味着您可以使用任何二进制序列作为键,从字符串(如 "foo")到 JPEG 文件的内容。空字符串也是有效的键。

关于键的一些其他规则

  • 非常长的键不是一个好主意。例如,一个 1024 字节的键不仅在内存方面是个坏主意,而且因为在数据集中查找键可能需要多次耗时的键比较。即使当前任务是匹配一个大值的存在,对其进行哈希(例如使用 SHA1)也是一个更好的主意,特别是在内存和带宽方面。
  • 非常短的键通常也不是一个好主意。如果您可以写成 "user:1000:followers",那么将 "u1000flw" 作为键就没有多大意义。后者更具可读性,并且增加的空间与键对象本身和值对象所占用的空间相比微不足道。虽然短键显然会消耗更少的内存,但您的任务是找到合适的平衡点。
  • 尽量坚持使用某种模式。例如,“对象类型:id”是一个好主意,如 "user:1000"。点号或破折号通常用于多词字段,如 "comment:4321:reply.to" 或 "comment:4321:reply-to"。
  • 允许的最大键大小为 512 MB。

修改和查询键空间

有些命令并非针对特定类型定义,但它们在与键空间交互时非常有用,因此可以与任何类型的键一起使用。

例如,EXISTS 命令返回 1 或 0 来指示数据库中是否存在给定键,而 DEL 命令则删除键及其关联的值,无论该值是什么。

> set mykey hello
OK
> exists mykey
(integer) 1
> del mykey
(integer) 1
> exists mykey
(integer) 0

从示例中您还可以看到 DEL 本身如何根据键是否被删除(即存在)或未被删除(即没有该名称的键)返回 1 或 0。

有许多与键空间相关的命令,但上面两个以及 TYPE 命令是必不可少的,TYPE 命令返回指定键存储的值的类型

> set mykey x
OK
> type mykey
string
> del mykey
(integer) 1
> type mykey
none

键过期

在继续之前,我们应该了解 Valkey 的一个重要功能:键过期,它独立于您存储的值类型而工作。键过期允许您为键设置一个超时时间,也称为“生存时间”或“TTL”。当生存时间过去后,键会自动销毁。

关于键过期的一些重要注意事项

  • 它们可以使用秒或毫秒精度进行设置。
  • 然而,过期时间的分辨率始终是 1 毫秒。
  • 有关过期时间的信息会被复制并持久化到磁盘上,当 Valkey 服务器停止时,时间实际上是流逝的(这意味着 Valkey 会保存键的过期日期)。

使用 EXPIRE 命令设置键的过期时间

> set key some-value
OK
> expire key 5
(integer) 1
> get key (immediately)
"some-value"
> get key (after some time)
(nil)

在两次 GET 调用之间键消失了,因为第二次调用被延迟了 5 秒以上。在上面的示例中,我们使用 EXPIRE 来设置过期时间(它也可以用于为已经有过期时间的键设置不同的过期时间,就像 PERSIST 可以用于移除过期时间并使键永久存在一样)。然而,我们也可以使用其他 Valkey 命令创建带有过期时间的键。例如,使用 SET 选项

> set key 100 ex 10
OK
> ttl key
(integer) 9

上面的示例设置了一个字符串值为 100 的键,其过期时间为十秒。随后调用 TTL 命令以检查该键的剩余生存时间。

要以毫秒为单位设置和检查过期时间,请查看 PEXPIREPTTL 命令,以及 SET 选项的完整列表。

扫描

为了高效地递增迭代 Valkey 数据库中的键,您可以使用 SCAN 命令。

由于 SCAN 允许增量迭代,每次调用只返回少量元素,因此可以在生产环境中使用,而不会像 KEYSSMEMBERS 等命令在处理大量键或元素集合时可能长时间(甚至数秒)阻塞服务器。

然而,虽然像 SMEMBERS 这样的阻塞命令能够在一个给定时刻提供集合中的所有元素,但 SCAN 系列命令对返回的元素只提供有限的保证,因为我们增量迭代的集合在迭代过程中可能会发生变化。

另一种遍历键空间的方法是使用 KEYS 命令,但这种方法应谨慎使用,因为 KEYS 会阻塞 Valkey 服务器直到所有键都被返回。

警告:请将 KEYS 命令视为在生产环境中应极其谨慎使用的命令。

KEYS 在大型数据库上执行时可能会严重影响性能。此命令旨在用于调试和特殊操作,例如更改键空间布局。请勿在常规应用程序代码中使用 KEYS。如果您正在寻找在键空间子集中查找键的方法,请考虑使用 SCAN集合

支持的 glob 风格模式

  • h?llo 匹配 hellohallohxllo
  • h*llo 匹配 hlloheeeello
  • h[ae]llo 匹配 hellohallo, 但不匹配 hillo
  • h[^e]llo 匹配 hallohbllo 等,但不匹配 hello
  • h[a-b]llo 匹配 hallohbllo

如果您想精确匹配特殊字符,请使用 \ 进行转义。