如何管理Redis数据库和键

介绍

Redis是一种开源的、内存中的键值数据存储系统。一个键值数据存储是一种NoSQL数据库,其中用作其关联的唯一标识符。任何给定的Redis实例包括许多数据库,每个数据库可以包含许多不同数据类型的键。

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

如何使用本指南

本指南以包含自包含示例的速查表形式撰写。我们鼓励您跳转到与您尝试完成的任务相关的任何部分。

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

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

管理数据库

Redis实例默认支持16个逻辑数据库。这些数据库在功能上被有效地隔离,当在一个数据库中运行命令时,不会影响Redis实例中其他数据库中存储的任何数据。

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

  1. select 15

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

要将一个数据库中保存的所有数据与另一个数据库中保存的数据进行交换,请使用swapdb命令。以下示例将在数据库6中保存的数据与数据库8中的数据进行交换,连接到任一数据库的任何客户端都将能够立即实施更改:

  1. swapdb 6 8

swapdb如果交换成功将返回OK

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

  • 目标数据库的主机名或IP地址
  • 目标数据库的端口号
  • 要迁移的键的名称
  • 要在目标实例上存储键的数据库编号
  • A timeout, in milliseconds, which defines the maximum amount of idle communication time between the two machines. Note that this isn’t a time limit for the operation, but means that the operation should always make some level of progress within the defined length of time

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

  1. migrate 203.0.113.0 6379 key_1 7 8000

此外,migrate 提供了以下选项,您可以在超时参数后添加:

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

管理键

有许多有用于管理键的Redis命令,无论它们保存什么类型的数据。以下部分回顾了其中一些命令。

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

  1. rename old_key new_key

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

  1. randomkey
Output
"any_key"

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

  1. type key_1
Output
"string"

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

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

  1. move key_1 8

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

删除键

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

  1. del key_1 key_2

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

unlink命令执行与del类似的功能,不同之处在于del在服务器收回键占用的内存时会阻塞客户端。如果要删除的键与小对象相关联,则del重新获取内存所需的时间非常短,阻塞时间甚至可能不可感知。

然而,如果要删除的密钥与许多对象关联,例如包含数千或数百万字段的哈希表,可能会变得不便。删除这样的密钥可能需要相当长的时间,并且在完全从服务器内存中删除之前,您将被阻止执行任何其他操作。

unlink,然而,首先确定释放密钥占用的内存的成本。如果很小,那么unlink的功能与del相同,立即通过密钥删除,同时阻止客户端。然而,如果为密钥释放内存的成本很高,unlink将通过创建另一个线程并在后台逐步回收内存而异步地删除密钥:

  1. unlink key_1

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

警告:以下两个命令被视为危险flushdbflushall命令将不可逆地删除单个数据库中的所有密钥以及Redis服务器上每个数据库中的所有密钥。只有在您绝对确定要删除数据库或服务器中的所有密钥时才建议运行这些命令。

可能更符合您的利益将这些命令的名称重命名为一些更不容易意外运行的名称。

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

  1. flushdb

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

  1. flushall

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

备份您的数据库

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

  1. save

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

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

  1. bgsave

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

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

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

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

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

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

简而言之,shutdown命令本质上是一个阻塞的save命令,它还会刷新所有最近的更改到追加文件并关闭与Redis实例的连接。

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

事实上,将这个命令重命名为一个更不容易意外运行的名称可能符合您的利益。

  1. shutdown

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

  1. shutdown save

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

  1. shutdown nosave

请注意,附加文件可能会随时间变得非常长,但您可以通过编辑redis.conf文件,根据某些变量配置Redis以重写文件。您还可以通过运行bgrewriteaof命令指示Redis重新编写附加文件:

  1. bgrewriteaof

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

结论

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

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

Source:
https://www.digitalocean.com/community/cheatsheets/how-to-manage-redis-databases-and-keys