键空间

在 Redis 中管理密钥:密钥过期、扫描、更改和查询密钥空间

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

关于键的其他一些规则:

  • 非常长的键不是一个好主意。例如,1024 字节的密钥是错误的 想法不仅在内存方面,还因为在 数据集可能需要几个成本高昂的键比较。即使手头的任务 是匹配一个大值的存在,对其进行哈希处理(例如 替换为 SHA1)是一个更好的主意,尤其是从内存的角度来看 和带宽。
  • 非常短的键通常不是一个好主意。写作没有什么意义 “u1000flw” 作为键,如果您可以改为编写 “user:1000:followers”。后者 更具可读性,并且添加的空格与 Key 对象本身和 Value 对象。虽然短键显然会 消耗更少的内存,您的工作是找到合适的平衡。
  • 尝试坚持使用 schema。例如,“object-type:id” 就是一个很好的 idea,如 “user:1000”。点或破折号通常用于多词 字段,如 “comment:4321:reply.to” 或 “comment:4321:reply-to”。
  • 允许的最大密钥大小为 512 MB。

更改和查询密钥空间

有些命令未在特定类型上定义,但很有用 以便与空间的 keys 进行交互,因此,可以与 任何类型的密钥。

例如,EXISTScommand 返回 1 或 0 以表示给定键 在数据库中存在或不存在,而DEL命令删除密钥 和关联的值,无论值是什么。

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

从这些示例中,您还可以了解如何作DEL本身返回 1 或 0,具体取决于 密钥被删除(它存在)或未删除(没有这样的密钥) name) 的 S S

与空间相关的关键命令有很多,但以上两个是 essential 的与TYPEcommand 返回 的值存储在指定键中:

> 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在 order 来设置过期时间(也可以用来设置一个不同的 expire 复制到已经具有 key 的 key,例如PERSIST可以按顺序使用 以删除 Expire 并使密钥永久保留)。然而,我们 还可以使用其他 Redis 命令创建带有 expires 的密钥。例如 用SET选项:

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

上面的示例使用字符串值设置 key100,具有 expire 的 10 秒。稍后TTL命令以检查 钥匙的剩余生存时间。

要设置和检查 expires in milliseconds,请检查PEXPIRE和 这PTTL命令以及SET选项。

扫描

要以高效的方式增量迭代 Redis 数据库中的键,您可以使用SCAN命令。

因为SCAN允许增量迭代,每次调用只返回少量元素,它可以在生产中使用,而不会有命令的缺点,如KEYSSMEMBERS当针对大量键或元素调用时,这可能会阻止服务器很长时间(甚至几秒钟)。

但是,虽然阻止了像SMEMBERS能够在给定时刻提供属于 Set 的所有元素。 这SCAN命令系列仅对返回的元素提供有限的保证,因为我们增量迭代的集合可以在迭代过程中更改。

钥匙

迭代键空间的另一种方法是使用KEYS命令,但应谨慎使用此方法,因为KEYS将阻塞 Redis 服务器,直到返回所有 key。

警告:考虑KEYS作为只应在生产中使用的命令 环境。

KEYS在对大型数据库执行时可能会破坏性能。 此命令用于调试和特殊作,例如更改 您的 Keyspace 布局。 不要使用KEYS在您的常规应用程序代码中。 如果你正在寻找一种方法来在 keyspace 的子集中查找 key,请考虑 用SCAN

支持的 glob 样式模式:

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

如果要逐字匹配特殊字符,则用于转义它们。\