键和值
提示
来自deepseek解释
原文链接:https://redis.io/docs/latest/develop/using-commands/keyspace/
您在 Redis 数据库中存储的每个数据对象都有其唯一的键。键是一个字符串,您将其传递给 Redis 命令以检索相应的对象或修改其数据。与特定键关联的数据对象称为值,二者合称为键值对。
键的内容
键通常是一个文本名称,在您的数据模型中具有一定含义。与编程语言中的变量名不同,Redis 键对其格式几乎没有限制,因此包含空格或标点符号的键大多也是可以的(例如 "1st Attempt" 或 "% of price in $")。Redis 不支持键的命名空间或其他分类,因此您必须注意避免名称冲突。但是,有一个约定是使用冒号 ":" 字符将键分成多个部分(例如 "person:1"、"person:2"、"office:London"、"office:NewYork:1")。您可以将其作为一种简单的方法将键归类到一起。
虽然键通常是文本,但 Redis 实际上实现了二进制安全的键,因此您可以使用任何字节序列作为有效键,例如 JPEG 文件或应用程序中的结构体值。空字符串在 Redis 中也是有效的键。
关于键还有一些其他需要注意的事项:
- 非常长的键不是一个好主意。例如,1024 字节的键不仅内存方面不好,而且因为在数据集中查找键可能需要进行多次代价较高的键比较。即使当前任务是匹配一个大值是否存在,对其进行哈希(例如使用 SHA1)也是一个更好的想法,特别是从内存和带宽的角度来看。
- 非常短的键通常也不是一个好主意。如果您可以写成 "user:1000:followers",那么写成 "u1000flw" 作为键就没有什么意义。后者更具可读性,并且与键对象本身和值对象所使用的空间相比,增加的空间很小。虽然短键显然会消耗更少的内存,但您的任务是找到合适的平衡。
- 尽量遵循一种模式。例如 "object-type:id" 是一个好主意,如 "user:1000"。点或破折号常用于多词字段,如 "comment:4321:reply.to" 或 "comment:4321:reply-to"。
- 允许的最大键大小为 512 MB。
哈希标签
Redis 使用哈希以高效的方式检索与键关联的值。哈希涉及组合键中的原始字节值以生成一个整数索引号。然后使用该索引定位存储该键值的哈希槽。
通常,整个键用于计算哈希索引,但在某些情况下您只需要哈希键的一部分。您可以使用一对花括号 {...} 创建哈希标签来选择要哈希的键部分。例如,键 person:1 和 person:2 产生不同的哈希索引,但 {person}:1 和 {person}:2 产生相同的索引,因为只有花括号中的 person 哈希标签部分用于哈希计算。
哈希标签的一个常见用途是允许在集群数据库中使用多键操作(更多信息请参见数据库集群)。Redis 不允许在集群数据库中进行大多数多键操作,除非所有键产生相同的哈希索引。例如,SINTER 命令查找两个不同集合值的交集。这意味着命令
SINTER group:1 group:2在集群数据库中无法工作,但
SINTER {group}:1 {group}:2可以工作,因为哈希标签确保两个键产生相同的哈希索引。
请注意,虽然哈希标签在某些情况下很有用,但您不应一般性地养成使用它们的习惯。如果太多键映射到同一个哈希槽,最终会损害数据库的性能。有关如何使用哈希标签的更多信息,请参阅数据库集群。
修改和查询键空间
有一些命令不是针对特定类型定义的,但对于与键空间交互很有用,因此可以用于任何类型的键。
例如,EXISTS 命令返回 1 或 0 以指示给定键是否存在于数据库中,而 DEL 命令删除一个键及其关联值,无论值是什么。
> set mykey hello
OK
> exists mykey
(integer) 1
> del mykey
(integer) 1
> exists mykey
(integer) 0
从示例中您还可以看到 DEL 本身返回 1 或 0,取决于键是否被删除(存在)或不存在(没有该名称的键)。
还有许多与键空间相关的命令,但上述两个是基本命令,再加上 TYPE 命令,它返回存储在指定键中的值的类型:
> set mykey x
OK
> type mykey
string
> del mykey
(integer) 1
> type mykey
none
键过期
在继续之前,我们应该了解一个重要的 Redis 特性,它无论您存储的值类型如何都有效:键过期。键过期允许您为键设置超时时间,也称为“生存时间”或“TTL”。当生存时间过去后,键会被自动销毁。
关于键过期的一些重要注意事项:
- 可以使用秒或毫秒精度来设置。
- 但过期时间分辨率始终为 1 毫秒。
- 过期信息会被复制并持久化到磁盘,当您的 Redis 服务器停止时,时间实际上仍在流逝(这意味着 Redis 保存键将过期的日期)。
使用 EXPIRE 命令设置键的过期时间:
> set key some-value
OK
> expire key 5
(integer) 1
> get key (立即执行)
"some-value"
> get key (一段时间后)
(nil)
在两次 GET 调用之间键消失了,因为第二次调用延迟了超过 5 秒。在上面的示例中,我们使用 EXPIRE 来设置过期时间(它也可以用于为已经有过期时间的键设置不同的过期时间,就像 PERSIST 可用于移除过期时间并使键永久持久化)。但我们也可以使用其他 Redis 命令创建带有过期时间的键。例如使用 SET 的选项:
> set key 100 ex 10
OK
> ttl key
(integer) 9
上面的示例设置了一个键,其字符串值为 100,过期时间为 10 秒。之后调用 TTL 命令以检查键的剩余生存时间。
要以毫秒为单位设置和检查过期时间,请查看 PEXPIRE 和 PTTL 命令,以及 SET 选项的完整列表。
浏览键空间
Scan
要以高效的方式增量迭代 Redis 数据库中的键,可以使用 SCAN 命令。
由于 SCAN 允许增量迭代,每次调用只返回少量元素,因此可以在生产环境中使用,而没有 KEYS 或 SMEMBERS 等命令的缺点,这些命令在针对大型键或元素集合调用时可能会长时间阻塞服务器(甚至几秒钟)。
然而,像 SMEMBERS 这样的阻塞命令能够提供在给定时刻集合中的所有元素。而 SCAN 系列命令对返回的元素只提供有限保证,因为我们在增量迭代时集合可能会发生变化。
Keys
另一种遍历键空间的方法是使用 KEYS 命令,但这种方法应谨慎使用,因为 KEYS 会阻塞 Redis 服务器,直到所有键返回。
警告:将 KEYS 视为一个命令,仅应在生产环境中极其谨慎地使用。
KEYS 在针对大型数据库执行时可能会破坏性能。此命令旨在用于调试和特殊操作,例如更改键空间布局。不要在常规应用程序代码中使用 KEYS。如果您正在寻找一种在键空间子集中查找键的方法,请考虑使用 SCAN 或集合。
支持的 glob 风格模式:
h?llo匹配hello、hallo和hxlloh*llo匹配hllo和heeeelloh[ae]llo匹配hello和hallo,但不匹配hilloh[^e]llo匹配hallo、hbllo……但不匹配helloh[a-b]llo匹配hallo和hbllo
如果要逐字匹配特殊字符,请使用 \ 进行转义。