如何管理 Redis 数据库以及 Keys

源地址:https://www.digitalocean.com/community/cheatsheets/how-to-manage-redis-databases-and-keys
作者:Mark Drake

简介

Redis 是一个开源的、运行在内存中的键值数据库。键值对数据库是一种将 key 作为相关 value 唯一标识的 NoSQL 数据库。任何一个 Redis 示例都包含了数个可以容纳不同数据类型键的 数据库。在这个教程中,我们将介绍如何选择数据库、在数据库之间移动键值对以及管理和删除键值对。

如何使用这个教程

这个教程是以小抄(Cheat Sheet)的形式写的,有对应的例子。我们鼓励你直接跳转到和你要完成的任务相关的章节进行阅读。

这个教程中的命令在 Ubuntu 18.04 中的 Redis 4.0.9 版本完成测试。如果你需要建设一个同样的环境,可以参考我们的 如何在 Ubuntu 18.04 上安装并加固 Redis 中的 Step 1 来安装 Redis。我们将通过 Redis 命令行界面redis-cli运行这些命令,来演示这些命令的行为。请注意,如果你使用不同的 Redis 工具--例如Redli —— 某些命令的实际输出可能有所不同。

此外,你还可以使用一个代管的 Redis 数据库实例来测试这些命令。但需要注意的是,根据你的数据库服务提供商的限制,这个教程中的某些命令可能运行效果和教程不一致。如果想要使用 DigitalOcean 提供的代管数据库,可以查看我们的代管数据库产品文档。使用代管 Redis 数据库实例时,你必须安装 Redli设置 TLS 隧道 来通过 TLS 链接到代管数据库。

管理数据库

默认情况下,一个 Redis 实例支持 16 个逻辑数据库。这些数据库之间是相互隔离的,你在一个数据库中执行命令时,不会影响存储在同一 Redis 实例中的其他数据库中的任何数据。

Redis 数据库的编号从 015 ,默认情况下,你连接到 Redis 实例时会使用数据库 0。你可以在连接成功后,使用 select 命令变更你所使用的数据库。

127.0.0.1:6379> select 15

如果你选择了 0 之外的数据库,它将会展示在 redis-cli 命令行提示符上。

127.0.0.1:6379[15]>

如果一个数据库想要和另外一个数据库交换数据,可以使用 swapdb 命令。下面的这个例子将数据库 6 和数据库 8 的数据进行交换,与这两个数据库相连的客户端马上就能看到对应的变化。

127.0.0.1:6379> swapdb 6 8

如果交换成功,swapdb 将会返回一个 OK

如果你想把一个键值对转移到不同的 Redis 实例,你可以运行migrate 命令。这个命令确保键值出现在目标实例之后,才会从源实例中删除键值对。 当你运行 migrate时,该命令必须按顺序输入以下参数:

  • 目标数据库的主机名或 IP 地址
  • 目标数据库的端口号
  • 你要迁移的键值对的 Key 的名称
  • 目标数据库中用于存储迁移数据的数据库编号
  • 超时时间,以毫秒为单位,它定义了两台机器之间的最大空闲通信时间。注意,这并不是操作的时间限制,只是操作应该在定义的时间内提供返回。

举例说明:

127.0.0.1:6379> migrate 203.0.113.0 6379 key_1 7 8000

此外,migrate 还支持如下选项,你可以在超时参数后添加:

  • COPY:设置迁移不从源数据库中删除键值对。
  • REPLACE:设置迁移时,如果目标数据库中已经存在相同的键值对,那么就替换它。
  • KEYS:如果想要迁移多个键值对,你可以输入一个空字符串 (""),然后使用 keys 命令的语法来迁移任何符合范式的键值对。更多关于keys工作原理的信息,请参见我们的教程 如何在 Redis 中排查问题

管理 Keys

有一些命令对任何数据类型都是有效的,它们对于管理键来说非常有用。我们将在本节中介绍其中的几个。

rename 将重命名指定的键。如果执行成功,它将返回 OK

127.0.0.1:6379> rename old_key new_key

你可以使用 randomkey 来从当前选中的数据库中返回一个随机的键。

127.0.0.1:6379> randomkey

输出

"any_key"

使用 type 来判断对应键的数据类型。这个命令的输出可能是string, list, hash, set, zset, 或 stream:

127.0.0.1:6379> type key_1

输出

"string"

如果对应的键不存在,type将会返回 none

你可以用 move 命令将一个单独的键移动到 Redis 实例中的另一个数据库中。例如,要将 key_1 移动到数据库 8,你可以执行以下命令:

127.0.0.1:6379> move key_1 8

如果移动键成功,move 将会返回 OK

删除 Keys

要删除一个或多个任何数据类型的键,使用 del 命令,后面跟一个或多个你想删除的键。

127.0.0.1:6379> del key_1 key_2

如果这个命令成功地删除了键,它将返回(integer) 1,否则,它将返回 (integer) 0`。

unlink 命令的功能与 del 类似,不同的是 del 会在服务器回收钥匙所占用的内存时阻塞客户端。如果被删除的键是与一个小对象相关联的,del 回收内存所需的时间是非常小的,阻塞时间甚至可能不会被注意到。

然而,如果你要删除的键与许多对象相关联,例如一个有数千或数百万字段的哈希值,这就会变得很不方便。删除这样一个键可能需要明显的长时间,而且你将被阻塞执行任何其他操作,直到它从服务器的内存中完全删除。

然而,unlink 首先会确定删除键所占用的内存的成本。如果它是小的,那么 unlink 的功能就和 del 一样,同时也阻塞了客户端。然而,如果为一个键分配内存的成本很高,unlink 将通过创建另一个线程来异步删除该键,并在后台逐步回收内存而不阻塞客户端。

127.0.0.1:6379> unlink key_1

由于它在后台运行,尽管 del 在大多数情况下也够用,一般仍建议你使用 unlink 从你的服务器上删除键,以减少客户端的错误。

警告:以下两个命令是比较危险的flushdbflushall 命令将分别不可逆转地删除单个数据库中的所有键和 Redis 服务器上每个数据库中的所有键。我们建议你只在你绝对确定要删除数据库或服务器中的所有键时才运行这些命令。

出于安全考虑,你可以选择将这些命令重命名为不容易被意外运行的命令。

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

127.0.0.1:6379> flushdb

要删除 Redis 服务器上每个数据库中的所有键(包括当前选定的数据库),运行 flushall

127.0.0.1:6379> flushall

flushdbflushall 都支持 async 选项,来实现异步删除单个数据库或集群中每个数据库的所有键。加入 async 选项后,它们的功能类似于 unlink 命令,它们将创建一个新的线程,在后台逐步释放内存。

备份你的数据库

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

127.0.0.1:6379> save

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

save 是同步运行的,并且会阻塞任何其他连接到数据库的客户端。因此,在save 命令文档中建议,如非必要,在生产环境中不应该运行这个命令。它更建议使用 bgsave 命令,Redis 将会 Fork 数据库:父进程将继续为客户提供服务,而子进程在退出前保存数据库:

127.0.0.1:6379> bgsave

注意,如果客户端在 bgsave 操作发生时添加或修改数据,这些变化不会被捕捉到快照中。

你也可以通过配置 Redis,修改数据库最小变更次数,让 Redis 在特定时间后自动保存快照(称为snapshottingRDB 模式)。这个功能被称为保存点。下述 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 数据,并关闭连接。这个命令将阻止每一个连接到数据库的客户端,然后在至少配置了一个保存点的情况下执行 save 操作,它将阻止客户端做任何变更,并将当前状态的数据库导出到 .rdb 文件。

此外,如果 append-only-file 模式被启用,shutdown命令将在退出前刷新对 Redis 的 append-only 文件的修改。append-only-file(AOF) 模式可以在每次快照后,在一个以.aof结尾的文件中创建服务器上的每个写操作日志。AOF 和 RDB 模式可以在同一台服务器上启用,这两种持久化方法是备份数据的有效方式。

简而言之,"shutdown "命令本质上是一个阻塞的 "save "命令,它也会刷新所有最近的变化到 append-only 文件并关闭与 Redis 实例的连接。

警告shutdown 比较危险。通过阻塞客户端,它使 Redis 中的数据对于依赖它的用户和应用程序不可用。我们建议你只在测试 Redis 的行为或你绝对确定你想要阻塞所有 Redis 实例的客户端时使用这个命令。

事实上,你可能需要重命名这个命令,来避免意外执行这个命令。

127.0.0.1:6379> shutdown

如果你没有配置任何保存点,但仍然希望 Redis 执行 save 操作,请在 shutdown 命令中添加 save 参数。

127.0.0.1:6379> shutdown save

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

127.0.0.1:6379> shutdown nosave

注意,随着时间的推移,append-only 的文件可能会变得很长,但你可以通过编辑redis.conf文件,配置 Redis 根据某些变量重写该文件。你也可以通过运行bgrewriteaof命令来要求 Redis 更新 append-only 文件。

127.0.0.1:6379> bgrewriteaof

bgrewriteaof 将创建全新的命令集,使数据库恢复到当前状态。正如这个命令的名字所暗示的,它将在后台运行。但如果另外一个持久化命令已经在后台运行,这个命令必须要在 Redis 服务器执行 bgrewriteaof 前完成。

总结

本指南详细介绍了一些用于管理数据库和密钥的命令。