引言

Redis 是一个开源的、内存中的键值数据存储。 键值数据存储是 NoSQL 数据库的一种类型,其中键作为其关联值的唯一标识符。 任何给定的 Redis 实例都包含许多数据库,每个数据库都可以包含各种数据类型的许多不同键。 在本教程中,我们将介绍如何选择数据库、在数据库之间移动键以及管理和删除键。

如何使用本指南

本指南是作为包含自包含示例的备忘单编写的。 我们鼓励您跳转到任何与您正在尝试完成的任务相关的部分。

本指南中显示的命令是在运行 Redis 4.0.9版本的 Ubuntu 18.04服务器上测试的。 要建立一个类似的环境,你可以按照我们关于如何在 Ubuntu 18.04上安装和保护 Redis 的指南的第一步。 我们将通过使用 Redis-cli (Redis 命令行界面)运行这些命令来演示它们的行为。 请注意,如果您使用的是不同的 Redis 接口ーー例如 Redli ーー某些命令的确切输出可能会有所不同。

或者,您可以提供一个托管 Redis 数据库实例来测试这些命令,但是请注意,根据您的数据库提供程序所允许的控制级别,本指南中的某些命令可能不能像描述的那样工作。 要提供一个数字数据库管理数据库,请遵循我们的管理数据库产品文档。 然后,必须安装 Redli 或设置 TLS 通道,以便通过 TLS 连接到托管数据库。

管理数据库

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

Redis 数据库的编号从0到15,并且默认情况下,在连接到 Redis 实例时连接到数据库0。 但是,你可以在连接之后用 select 命令更改你正在使用的数据库:

  • select 15

如果您选择的数据库不是0,它将反映在 redis-cli 提示符中:

若要将一个数据库中保存的所有数据与另一个数据库中保存的数据进行交换,请使用 swapdb 命令。 下面的示例将数据库6中的数据与数据库8中的数据进行交换,任何连接到任何一个数据库的客户机都可以立即看到变化:

  • swapdb 6 8

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

如果要将键移动到另一个 Redis 实例,可以运行 migrate。 此命令确保在从源实例中删除目标实例之前,该键存在于目标实例中。 当你运行 migrate 时,命令必须按照这个顺序包含以下元素:

  • 目标数据库的主机名或 IP 地址
  • 目标数据库的端口号
  • 要迁移的密钥的名称
  • 要在目标实例上存储密钥的数据库编号
  • 以毫秒为单位的超时,定义两台计算机之间的最大空闲通信时间。 请注意,这并不是操作的时间限制,只是操作应该总是在定义的时间长度内取得一定程度的进展

举例说明:

  • migrate 203.0.113.0 6379 key_1 7 8000

此外,migrate 允许在超时参数之后添加以下选项:

  • Copy: 指定不应从源实例中删除键
  • Replace: 指定如果目标上已存在键,则 migrate 操作应删除并替换它
  • Keys: 您可以输入一个空字符串(“”) ,然后使用 KEYS 命令的语法来迁移与模式匹配的任何键,而不是提供一个特定的要迁移的键。 有关密钥如何工作的更多信息,请参阅我们的教程如何在 Redis 解决问题。

管理钥匙

有许多 Redis 命令对于管理键非常有用,不管它们保存的数据类型如何。 我们将在这一部分讨论其中的一些问题。

Rename 将重命名指定的键。如果成功,它将返回 OK:

  • rename old_key new_key

您可以使用 randomkey 从当前选定的数据库返回一个随机键:

  • randomkey
Output
"any_key"

使用 type 确定给定键所持有的数据类型。 该命令的输出可以是 string、 list、 hash、 set、 zset 或 stream:

  • type key_1
Output
"string"

如果指定的键不存在,则键入将返回 none。

可以使用 move 命令将单个密钥移动到 Redis 实例中的另一个数据库。 Move 接受键的名称和要将键移动到其中的数据库作为参数。 例如,要将键1移动到数据库8,可以运行以下命令:

  • move key_1 8

移动将返回 OK,如果移动键是成功的。

删除键

若要删除任何数据类型的一个或多个键,请使用 del 命令,后跟一个或多个要删除的键:

  • del key_1 key_2

如果此命令成功删除密钥,它将返回(整数)1。 否则,它将返回(整数)0。

Unlink 命令执行与 del 类似的功能,不同之处在于,当服务器回收键占用的内存时,del 会阻塞客户机。 如果被删除的密钥与一个小对象相关联,则 del 回收内存所需的时间非常短,甚至可能无法察觉阻塞时间。

但是,如果您要删除的密钥与许多对象相关联,比如具有数千或数百万字段的散列,则可能会变得不方便。 删除这样的密钥可能会花费很长的时间,而且在从服务器内存中完全删除之前,您将无法执行任何其他操作。

然而,unlink 首先决定释放被密钥占用的内存的开销。 如果它很小,那么立即取消链接的方式与按键删除相同,同时也阻塞客户端。 然而,如果为一个密钥释放内存的代价很高,unlink 会通过创建另一个线程来异步删除密钥,并在不阻塞客户端的情况下逐步回收后台内存:

  • unlink key_1

因为它是在后台运行的,所以通常建议您使用 unlink 从服务器上删除密钥,以减少客户机上的错误,尽管在许多情况下,del 也足够了。

警告: 以下两个命令被认为是危险的。 Flushdb 和 flushhall 命令将分别不可逆地删除单个数据库中的所有键和 Redis 服务器上每个数据库中的所有键。 我们建议您只在绝对确定要删除数据库或服务器中的所有密钥时才运行这些命令。 将这些命令重命名为更低意外运行可能性的命令可能符合您的利益。

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

  • flushdb

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

  • flushall

Flushdb 和 flushhall 都接受 async 选项,它允许您异步删除单个数据库或集群中的每个数据库上的所有键。 这允许它们的功能类似于 unlink 命令,并且它们将创建一个新线程,以便在后台逐步释放内存。

备份数据库

要创建当前选定数据库的备份,可以使用 save 命令:

  • save

将当前数据集的快照导出为。 Rdb 文件,它是一个数据库转储文件,以内部压缩的序列化格式保存数据。

保存同步运行,并将阻止任何其他客户端连接到数据库。 因此,save 命令文档建议这个命令几乎不应该在生产环境中运行。 相反,它建议使用 bgsave 命令。 这告诉 Redis 去分支数据库: 父进程将继续为客户端服务,而子进程在退出前保存数据库:

  • bgsave

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

还可以编辑 Redis 配置文件,如果对数据库进行了最少次数的更改,则在一段时间后,让 Redis 自动保存快照(称为 snapshotting 或 RDB 模式)。 这就是所谓的保存点。 下面的保存点设置在 redis.conf 文件中默认启用:

/etc/redis/redis.conf
. . .
save 900 1
save 300 10
save 60 10000
. . .
dbfilename "nextfile.rdb"
. . .

使用这些设置,如果至少更改了1个键,Redis 将每900秒将数据库的快照导出到 dbfilename 参数定义的文件; 如果至少更改了10个键,则每300秒导出一次; 如果至少更改了10000个键,则每60秒导出一次。

可以使用 shutdown 命令备份 Redis 数据,然后关闭连接。 这个命令将阻止连接到数据库的每个客户机,然后在配置了至少一个保存点的情况下执行保存操作,这意味着它将把当前状态的数据库导出到。 在阻止客户端进行任何更改时,请使用 rdb 文件。

此外,如果启用了仅限追加模式,则在退出之前,shutdown 命令将刷新对 Redis 的仅限追加文件的更改。 仅追加文件模式(AOF)包括在以。为结尾的文件中创建服务器上每个写操作的日志。 在每张快照之后 after every snapshot。 可以在同一台服务器上启用 AOF 和 RDB 模式,使用这两种持久性方法是备份数据的有效方法。

简而言之,shutdown 命令本质上是一个阻塞保存命令,它同时刷新所有最近对 append-only 文件的更改,并关闭与 Redis 实例的连接:

警告: shutdown 命令被认为是危险的。 通过阻塞 Redis 服务器的客户端,可以使依赖于该服务器的用户和应用程序无法使用数据。 我们建议您只在测试 Redis 的行为或者确定要阻止所有 Redis 服务器的客户端时才运行此命令。 事实上,将这个命令重命名为一个更低意外运行可能性的命令可能会对您有利。
  • shutdown

如果你没有配置任何保存点,但仍然希望 Redis 执行保存操作,那么将保存选项附加到‘ shutdown command:

  • shutdown save

如果你已经配置了至少一个保存点,但是你想在不执行保存的情况下关闭 Redis 服务器,你可以在命令中添加 nosave 参数:

  • shutdown nosave

请注意,随着时间的推移,仅限于附加的文件可能会变得非常长,但是您可以配置 Redis,以便通过编辑 Redis.conf 文件来基于特定的变量重写该文件。 您还可以指示 Redis 通过运行 bgrewriteaof 命令重写仅限于附加的文件:

  • bgrewriteaof

Bgrewriteaof 将创建使数据库恢复到当前状态所需的最短命令集。 正如这个命令的名字所暗示的,它将在后台运行。 但是,如果另一个持久性命令已经在后台进程中运行,则该命令必须在 Redis 执行 bgrewriteaof 之前完成。

总结

本指南详细介绍了用于管理数据库和密钥的许多命令。 如果你还有其他相关的命令、参数或者过程想要在本指南中看到,请在下面的评论中提问或者提出建议。

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