如何管理 Redis 数据库和密钥

介绍

Redis是一个开源的内存关键值数据存储库。 key-value data store是 NoSQL 数据库的一种类型,其中 keys 作为其相关的 values 的唯一标识符。

在本教程中,您将学习如何选择数据库,在数据库之间移动密钥,以及管理和删除密钥。

如何使用此指南

这个指南是写成一个骗局的表,包含自含的示例,我们鼓励你跳到任何与你试图完成的任务相关的部分。

在本指南中显示的命令在运行 Redis 版本 6.0.1 版本的 Ubuntu 22.04 服务器上进行了测试。 要设置类似的环境,您可以遵循我们指南中的 Step 1How To Install and Secure Redis on Ubuntu 22.04上进行测试。 我们将通过使用 Redis 命令行接口的 redis-cli 来展示这些命令的行为。 请注意,如果您使用不同的 Redis 接口 - Redli,例如 - 某些命令的准确输出可能会有所不同。

或者,您可以提供一个受管理的 Redis 数据库实例来测试这些命令,但取决于数据库提供商允许的控制水平,本指南中的一些命令可能无法按描述的方式工作。 要提供 DigitalOcean 受管理数据库,请遵循我们的 管理数据库产品文档

数据库管理

除此之外,一个 Redis 实例支持 16 个逻辑数据库. 这些数据库有效地彼此隔离,当您在一个数据库中运行命令时,它不会影响您的 Redis 实例中存储在其他数据库中的任何数据。

Redis 数据库的编号从015,默认情况下,当您连接到您的 Redis 实例时,您可以连接到数据库0

1select 15

如果您选择了0以外的数据库,则将反映在redis-cli提示中:

要用swapdb命令来交换一个数据库中的所有数据,使用另一个数据库中的所有数据,下面的示例将数据库中的数据库6与数据库中的数据库8进行交换,任何连接到任何数据库的客户端将能够立即执行更改:

1swapdb 6 8

swapdb将返回OK,如果交换成功。

如果你想将密钥移动到另一个 Redis 实例,你可以运行迁移。这个命令确保密钥存在于目标实例上,然后从源实例中删除它。

  • 目标数据库的主机名或 IP 地址
  • 目标数据库的端口号
  • 您要迁移的密钥的名称
  • 您要在目标实例上存储密钥的数据库号
  • 一个时空,在毫秒,这定义了两台机器之间的最大无聊通信时间。

为了说明,这里有一个例子:

1migrate 203.0.113.0 6379 key_1 7 8000

此外,‘迁移’允许您在时隔参数后添加以下选项:

  • COPY: 指定不应该从源实例 中删除密钥 * REPLACE: 指定如果密钥已经存在于目的地,则‘迁移’操作应该删除并取代它
  • KEYS: 不是提供特定密钥来迁移,您可以输入一个空串(`"'),然后使用‘keys’命令的语法来迁移任何匹配模式的密钥。

管理钥匙

有许多 Redis 命令可用于管理密钥,无论它们拥有什么类型的数据。

重命名将重命名指定密钥,如果成功,它将返回OK:

1rename old_key new_key

您可以使用随机密钥返回当前选择的数据库中的随机密钥:

1randomkey
1[secondary_label Output]
2"any_key"

此命令的输出可以是string,list,hash,set,zsetstream:

1type key_1
1[secondary_label Output]
2"string"

如果指定的密钥不存在,则类型将返回没有

在您的 Redis 实例中,您可以使用移动命令将一个单独的密钥移动到另一个数据库中。移动采用密钥的名称和您想要将密钥作为参数移动的数据库。

1move key_1 8

移动将返回OK,如果移动密钥成功。

删除钥匙

若要删除任何数据类型的一个或多个密钥,请使用del命令,然后是您想要删除的一个或多个密钥:

1del key_1 key_2

如果这个命令成功删除密钥(s),它将返回(integer) 1,否则它将返回(integer) 0

unlink命令执行类似于del的功能,与del的区别是del阻止客户端,因为服务器恢复了被钥匙所占用的内存。

但是,如果您正在删除的密钥与许多对象相关联,例如具有数千或数百万字段的哈希,删除此类密钥可能需要相当长的时间,并且您将被阻止执行任何其他操作,直到完全从服务器的内存中删除。

然而,unlink首先决定了分配密钥所占用的内存的成本。如果它很小,那么unlink会像del密钥一样立即工作,同时也阻止了客户端。

1unlink key_1

由于它在背景中运行,一般建议您使用脱链接来从服务器中删除密钥,以减少客户端上的错误,尽管在许多情况下,del也足够。

<$>[警告] 警告: 以下两个命令被认为是 危险的. flushdbflushall 命令将不可逆转地删除单个数据库中的所有密钥和每个数据库中的所有密钥,分别在 Redis 服务器上。

您可能感兴趣的是将 重命名这些命令转换为更低的意外运行可能性的东西。

要删除所选数据库中的所有密钥,请使用flushdb命令:

1flushdb

若要在 Redis 服务器上删除每个数据库中的所有密钥(包括当前选择的数据库),请运行flushall:

1flushall

flushdbflushall都接受了async选项,这允许您在单个数据库或群集中的每个数据库中以无同步的方式删除所有密钥。

备份您的数据库

要创建当前选择的数据库的备份,您可以使用保存命令:

1save

这将将当前数据集的截图导出为.rdb 文件,这是一个数据库沉积文件,该文件以内部、压缩的序列化格式存储数据。

因此,保存命令文档(https://redis.io/commands/save)建议这个命令几乎不应该在生产环境中运行。相反,它建议使用bgsave命令。

1bgsave

请注意,如果客户端在发生bgsave操作时添加或修改数据,则这些更改不会在快照中捕获。

您还可以编辑 Redis 配置文件,以便 Redis 自动保存快照(称为 snapshottingRDB 模式),如果对数据库进行了最少数量的更改,则可以在一定时间内进行编辑。

1[label /etc/redis/redis.conf]
2. . .
3save 900 1
4save 300 10
5save 60 10000
6. . .
7dbfilename "nextfile.rdb"
8. . .

使用这些设置,Redis 将每 900 秒将数据库的截图导出到由dbfilename参数定义的文件中,如果更改至少一个密钥,如果更改至少 10 个密钥,每 300 秒,如果更改至少 10000 个密钥,每 60 秒。

您可以使用关闭命令来备份您的 Redis 数据,然后关闭您的连接. 此命令将阻止连接到数据库的每个客户端,然后执行保存操作,如果配置了至少一个保存点,这意味着它将当前状态的数据库导出到.rdb 文件,同时防止客户端进行任何更改。

此外,如果启用了 append-only mode,则关闭命令将扫描 Redis 仅附件文件的更改,然后退出。 append-only file mode(AOF)涉及创建服务器上的每个写作操作的日志,在每个 snapshot 后以 `.aof’结束的文件中。

简而言之,关闭命令基本上是一个阻止保存命令,它还清除所有最近的附件文件的更改,并关闭与 Redis 实例的连接:

<$>[警告] **警告: **关闭命令 被认为是危险的. 通过阻止您的 Redis 服务器的客户端,您可以使您的数据无法被依赖于它的用户和应用程序。

事實上,它可能對你有興趣, 重命名這個命令 到一些較低的可能性被意外執行。

1shutdown

如果您尚未配置任何保存点,但仍希望 Redis 执行保存操作,请将保存选项附加到关闭命令中:

1shutdown save

如果您已配置至少一个保存点,但想要关闭 Redis 服务器而不执行保存,则可以将nosave参数添加到命令中:

1shutdown nosave

请注意,仅附件的文件可能会随着时间的推移而长大,但您可以通过编辑 redis.conf 文件来配置 Redis 以根据某些变量重写文件。

1bgrewriteaof

bgrewriteaof将创建最短的命令组,以使数据库恢复到当前状态,正如这个命令的名称所暗示的那样,它将在背景中运行,但是,如果另一个坚持命令已经在背景过程中运行,该命令必须在Redis执行bgrewriteaof之前完成。

结论

本指南详细介绍了一些用于管理数据库和密钥的命令. 如果您在本指南中想要了解的其他相关命令、论点或程序,请在评论中询问或提出建议。

有关 Redis 命令的更多信息,请参阅我们的教程系列 如何管理 Redis 数据库

Published At
Categories with 技术
comments powered by Disqus