系列教程导航

  1. 如何在 Ubuntu 18.04 上安装和保护 Redis
  2. 如何连接到 Redis 数据库
  3. 如何管理 Redis 数据库和 Keys
  4. 如何在 Redis 中管理副本和客户端
  5. 如何在 Redis 中管理字符串
  6. 如何在 Redis 中管理 list
  7. 如何在 Redis 中管理 Hashes
  8. 如何在 Redis 中管理 Sets
  9. 如何在 Redis 中管理 Sorted Sets
  10. 如何在 Redis 中运行事务
  11. 如何使 Redis 中的 Key 失效
  12. 如何解决 Redis 中的故障
  13. 如何从命令行更改 Redis 的配置
  14. Redis 数据类型简介

介绍

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

如何使用本指南

本指南以备有完整示例的备忘单形式编写。我们鼓励您跳至与您要完成的任务相关的任何部分。

本指南中显示的命令已在运行 Redis 4.0.9Ubuntu 18.04 服务器上进行了测试。要设置类似的环境,您可以按照指南 如何在 Ubuntu 18.04 上安装和保护 Redis步骤 1 进行操作。我们将通过使用 Redis 命令行界面(redis-cli)运行它们来演示这些命令的行为。请注意,如果您使用其他 Redis 界面(例如 Redli),则某些命令的确切输出可能会有所不同。

另外,您可以提供一个托管的 Redis 数据库实例来测试这些命令。但是请注意,根据数据库提供者所允许的控制级别,本指南中的某些命令可能无法按所述方式工作。要配置 DigitalOcean 托管数据库,请遵循我们的 托管数据库产品文档。然后,您必须 安装 Redli 设置 TLS 隧道 才能通过 TLS 连接到托管数据库。

管理数据库

开箱即用的 Redis 实例支持 16 个逻辑数据库。这些数据库实际上是相互隔离的,当您在一个数据库中运行命令时,它不会影响 Redis 实例中其他数据库中存储的任何数据。

Redis 数据库编号从 015。默认情况下,当您连接到 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 命令中的语法迁移与模式匹配的任何键。有关 keys 工作原理的更多信息,请参见我们的有关 如何在 Redis 中解决问题的 教程。

管理 Keys

有许多 Redis 命令可用于管理键,而不管它们所保存的数据类型是什么。在本节中,我们将介绍其中的一些。

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

rename old_key new_key

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

randomkey

输出示例:

"any_key"

使用 type 来确定给定键持有什么类型的数据。这条命令的输出可以是 stringlisthashsetzsetstream

type key_1

输出示例:

"string"

如果指定的键不存在,type 将返回 none

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

move key_1 8

如果成功移动钥匙,move 将返回 OK

删除 Keys

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

del key_1 key_2

如果此命令成功删除键,它将返回 (integer) 1。否则,它将返回 (integer) 0

unlink 命令执行的功能与 del 相似,不同之处在于,del 当服务器回收键占用的内存时,该块会阻止客户端。如果要删除的键与一个小对象相关联,则 del 回收内存所花费的时间将非常小,并且阻塞时间甚至可能不会很明显。

但是,例如,如果您要删除的键与许多对象相关联(例如具有数千或数百万个字段的哈希),则可能会带来不便。删除这样的键可能会花费相当长的时间,并且在将其从服务器内存中完全删除之前,您将无法执行任何其他操作。

unlink 首先要确定重新分配键占用的内存的成本。如果太小,则 unlink 立即起到与 del 相同的作用,同时也会阻塞客户端。但是,如果为键分配内存的成本很高,unlink 则将通过创建另一个线程异步删除键,并在后台递增回收内存而不阻塞客户端:

unlink key_1

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

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

您可能希望 将这些命令重命名 为偶然运行的可能性较低的名称。

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

flushdb

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

flushall

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

备份数据库

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

save

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

save 同步运行,将阻止连接到数据库的所有其他客户端。因此,save 命令文档 建议几乎不要在生产环境中运行此命令。相反,它建议使用 bgsave 命令。这告诉 Redis 派生数据库:父进程将继续为客户端提供服务,而子进程在退出之前保存数据库:

bgsave

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

如果对数据库进行了最少的更改,您还可以编辑 Redis 配置文件以使 Redis 在一定时间后自动保存快照(称为快照或 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 数据,然后关闭连接。如果配置了至少一个保存点,此命令将阻止连接到数据库的每个客户端,然后执行 save 操作,这意味着它将当前状态的数据库导出到 .rdb 文件中,而不阻止客户端进行任何更改。

此外,如果启用了仅附加模式,shutdown 命令将在退出前刷新对 Redis 的仅附加文件的更改。只追加文件模式(AOF)涉及在服务器上创建一个日志文件,每次写操作都会在 .aof 每个快照之后追加到文件结尾。可以在同一服务器上启用 AOF 和 RDB 模式,并且使用两种持久性方法都是备份数据的有效方法。

简而言之,shutdown 命令本质上是一个阻塞 save 命令,该命令还会刷新对仅附加文件的所有最新更改,并关闭与 Redis 实例的连接:

警告: shutdown 命令被认为是危险的。通过阻止 Redis 服务器的客户端,可以使数据对依赖它的用户和应用程序不可用。我们建议仅在测试 Redis 的行为或绝对确定要阻止所有 Redis 服务器的客户端时才运行此命令。

实际上,建议您 将这些危险命令重命名,以降低意外执行的风险。

shutdown

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

shutdown save

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

shutdown nosave

请注意,仅附加文件会随着时间的增长而变得很长,但是您可以配置 Redis 通过编辑 redis.conf 文件来基于某些变量重写。您还可以通过运行以下 bgrewriteaof 命令指示 Redis 重写仅附加文件:

bgrewriteaof

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

结论

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

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

说明: 本文基于 Ubuntu 18.04 和 Redis 4.0.9 编写。较新版本 Redis 可能在命令行为、默认配置或安全性要求上有所差异,请根据实际环境调整。