Keyspace

在Redis中管理键:键的过期、扫描、修改和查询键空间

Redis 键是二进制安全的;这意味着你可以使用任何二进制序列作为键,从像 "foo" 这样的字符串到 JPEG 文件的内容。空字符串也是一个有效的键。

关于键的其他一些规则:

  • 非常长的键不是一个好主意。例如,一个1024字节的键不仅在内存方面不好,而且因为在数据集中查找键可能需要多次昂贵的键比较。即使手头的任务是匹配一个大值的存在,对其进行哈希处理(例如使用SHA1)是一个更好的主意,特别是从内存和带宽的角度来看。
  • 非常短的键通常不是一个好主意。如果你可以写“user:1000:followers”,那么写“u1000flw”作为键就没有什么意义。后者更具可读性,并且与键对象本身和值对象使用的空间相比,增加的空间很小。虽然短键显然会消耗更少的内存,但你的工作是找到正确的平衡。
  • 尽量坚持使用一种模式。例如,"object-type: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命令一起,该命令返回存储在指定键中的值的类型:

> 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 (immediately)
"some-value"
> get key (after some time)
(nil)

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

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

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

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

扫描

要以高效的方式逐步迭代Redis数据库中的键,你可以使用SCAN命令。

由于SCAN允许增量迭代,每次调用只返回少量元素,因此可以在生产环境中使用,而不会像KEYSSMEMBERS这样的命令那样,当针对大量键或元素调用时,可能会长时间(甚至几秒钟)阻塞服务器。

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

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

警告: 请将KEYS视为一个命令,仅在生产环境中极其谨慎地使用。

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

支持的全局样式模式:

  • h?llo 匹配 hello, hallohxllo
  • h*llo 匹配 hlloheeeello
  • h[ae]llo 匹配 hellohallo, 但不匹配 hillo
  • h[^e]llo 匹配 hallo, hbllo, ... 但不匹配 hello
  • h[a-b]llo 匹配 hallohbllo

如果你想逐字匹配特殊字符,请使用\来转义它们。

RATE THIS PAGE
Back to top ↑