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
命令以检查该键的剩余生存时间。
要以毫秒为单位设置和检查过期时间,请查看 PEXPIRE
和 PTTL
命令,以及 SET
选项的完整列表。
浏览键空间
扫描
为了高效地递增迭代 Valkey 数据库中的键,您可以使用 SCAN
命令。
由于 SCAN
允许增量迭代,每次调用只返回少量元素,因此可以在生产环境中使用,而不会像 KEYS
或 SMEMBERS
等命令在处理大量键或元素集合时可能长时间(甚至数秒)阻塞服务器。
然而,虽然像 SMEMBERS
这样的阻塞命令能够在一个给定时刻提供集合中的所有元素,但 SCAN
系列命令对返回的元素只提供有限的保证,因为我们增量迭代的集合在迭代过程中可能会发生变化。
键
另一种遍历键空间的方法是使用 KEYS
命令,但这种方法应谨慎使用,因为 KEYS
会阻塞 Valkey 服务器直到所有键都被返回。
警告:请将 KEYS
命令视为在生产环境中应极其谨慎使用的命令。
KEYS
在大型数据库上执行时可能会严重影响性能。此命令旨在用于调试和特殊操作,例如更改键空间布局。请勿在常规应用程序代码中使用 KEYS
。如果您正在寻找在键空间子集中查找键的方法,请考虑使用 SCAN
或 集合。
支持的 glob 风格模式
h?llo
匹配hello
、hallo
和hxllo
h*llo
匹配hllo
和heeeello
h[ae]llo
匹配hello
和hallo,
但不匹配hillo
h[^e]llo
匹配hallo
、hbllo
等,但不匹配hello
h[a-b]llo
匹配hallo
和hbllo
如果您想精确匹配特殊字符,请使用 \
进行转义。