Redis数据库与键管理:高效运维与性能优化指南
Redis简介:内存键值数据库管理
Redis是一款开源的内存键值数据存储系统。键值数据存储是一种NoSQL数据库类型,其中键作为其关联值的唯一标识符。每个Redis实例包含多个数据库,每个数据库可以存储多种不同数据类型的键。
本教程将指导您如何选择数据库、在数据库之间移动键值对,以及管理和删除键值对。
如何使用本指南
本指南以自包含的示例备忘单形式编写。您可以根据需要,直接跳转到与您当前任务相关的任何部分。
本指南中展示的命令已在运行Redis 6.0.16版本的Ubuntu 22.04服务器上进行测试。如需设置类似环境,请参考我们的《Ubuntu 22.04上安装和保护Redis指南》的第一步。我们将通过redis-cli
(Redis命令行界面)运行这些命令来演示其行为。请注意,如果您使用不同的Redis接口(例如Redli),某些命令的精确输出可能会有所不同。
此外,您也可以使用托管的Redis数据库实例来测试这些命令。但请注意,根据您的数据库提供商所允许的控制级别,本指南中的某些命令可能无法正常工作。如需配置Silicon Cloud托管数据库,请遵循我们的托管数据库产品文档。之后,您必须安装Redli或设置TLS隧道,以便通过TLS连接到托管数据库。
管理数据库
一个Redis实例默认支持16个逻辑数据库。这些数据库在功能上相互隔离,在一个数据库中运行命令不会影响Redis实例中其他数据库存储的任何数据。
Redis数据库编号从0到15。连接到Redis实例时,默认连接到数据库0。然而,连接后,您可以使用SELECT
命令更改当前使用的数据库。
SELECT 15
如果您选择了除0之外的数据库,redis-cli
的提示符将随之改变。
127.0.0.1:6379[15]>
要将一个数据库中的所有数据与另一个数据库中的数据进行交换,请使用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
: 指定如果目标上已存在该键,迁移操作应删除并替换它。KEYS
: 您可以输入一个空字符串(""
)而不是提供特定的键进行迁移,然后使用KEYS
命令的语法来迁移匹配特定模式的任何键。有关KEYS
命令的更多信息,请阅读我们的《如何排查Redis问题》教程。
管理键
无论数据类型如何,Redis提供了许多命令用于管理键。以下部分将介绍其中一些常用命令。
RENAME
命令将重命名指定的键。如果成功,将返回OK
。
RENAME old_key new_key
您可以使用RANDOMKEY
命令从当前选定的数据库中返回一个随机的键。
RANDOMKEY
"any_key"
使用TYPE
命令确定给定键保存的数据类型。此命令的输出可以是string
(字符串)、list
(列表)、hash
(哈希)、set
(集合)、zset
(有序集合)或stream
(流)。
TYPE key_1
"string"
如果指定的键不存在,TYPE
将返回none
。
您可以使用MOVE
命令将Redis实例中的单个键移动到另一个数据库。MOVE
命令需要键的名称和要移动到的数据库作为参数。例如,要将键key_1
移动到数据库8,您需要执行以下命令:
MOVE key_1 8
如果成功移动了键,将返回OK
。
删除键
这是文章《如何管理Redis数据库和键》的第2部分(共2部分)。
要删除任何数据类型的一个或多个键,请使用DEL
命令,然后跟上您想要删除的一个或多个键。
127.0.0.1:6379> DEL key_1 key_2
如果此命令成功删除键,则会返回(整数)1
。否则,它将返回(整数)0
。
UNLINK
命令与DEL
命令执行类似的功能,但区别在于DEL
命令在服务器回收键占用的内存时会阻塞客户端。如果要删除的键与一个小对象相关联,那么DEL
命令回收内存所需的时间非常短,阻塞时间可能甚至不可察觉。
然而,如果例如,你要删除的键与许多对象相关联,比如一个有数千万个字段的哈希表,那么这将变得不方便。删除这样的键可能需要很长时间,并且在完全从服务器的内存中删除之前,您将被阻止执行任何其他操作。
然而,UNLINK
首先确定释放键占用内存的成本。如果成本较低,则UNLINK
立即像DEL
一样删除键,并同时阻塞客户端。然而,如果释放键内存的成本很高,则UNLINK
会创建一个另一个线程,并在后台逐步回收内存,而不会阻塞客户端。
127.0.0.1:6379> UNLINK key_1
由于它在后台运行,通常建议您使用UNLINK
从服务器中删除键以减少客户端错误,尽管在许多情况下DEL
也足够使用。
警告:以下两个命令被视为危险命令。FLUSHDB
和FLUSHALL
命令将不可逆地删除Redis服务器上一个数据库中的所有键和所有数据库中的所有键。强烈建议只有在您完全确定要删除数据库或服务器中的所有键时才运行这些命令。
更改这些命令的名称,以减少意外运行的可能性,可能符合您的利益。要删除所选数据库中的所有键,请使用FLUSHDB
命令。
127.0.0.1:6379> FLUSHDB
要在Redis服务器上删除所有数据库中的所有键(包括当前选择的数据库),运行FLUSHALL
命令即可。
127.0.0.1:6379> FLUSHALL
无论是FLUSHDB
还是FLUSHALL
命令都可以接受异步选项,该选项使您可以异步地删除单个数据库中的所有键或集群中的每个数据库。这使它们的功能类似于UNLINK
命令,并且它们将创建一个新线程以在后台逐步释放内存。
备份数据库
为了创建当前选择的数据库的备份,你可以使用SAVE
命令。
127.0.0.1:6379> SAVE
这将导出当前数据集的快照作为一个.rdb
文件,该文件是一个数据库转储文件,采用内部压缩序列化格式存储数据。
在同步模式下保存将会阻塞连接到数据库的其他客户端。因此,SAVE
命令的文档建议在生产环境中几乎不要运行此命令。相反,建议使用BGSAVE
命令。这会告诉Redis复制数据库:父进程将继续为客户端提供服务,而子进程在退出之前保存数据库。
127.0.0.1:6379> BGSAVE
请注意,在BGSAVE
操作进行时,如果客户端添加或修改数据,这些更改将不会被快照捕捉到。
如果数据库中对数据进行了最小数量的更改,你也可以编辑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数据,然后关闭连接。这个命令会阻塞所有连接到数据库的客户端,并且如果至少配置了一个保存点,就会执行保存操作,即将数据库的当前状态导出为一个.rdb
文件,同时防止客户端进行任何更改。
另外,如果启用了追加模式,在SHUTDOWN
命令退出之前,Redis会将更改刷新到追加文件。追加文件模式(AOF)涉及在每个快照后创建以.aof
结尾的文件,记录服务器上的每个写操作的日志。AOF和RDB模式可以在同一服务器上启用,并且同时使用这两种持久化方法是备份数据的有效方法。
简而言之,SHUTDOWN
命令本质上是一个阻塞式保存命令,它还会将所有最近的更改刷新到只追加文件,并关闭与Redis实例的连接。
警告:SHUTDOWN
命令被认为是危险的。通过阻塞你的Redis服务器的客户端,你可能会使你的数据对依赖它的用户和应用程序变得不可用。建议只有在测试Redis的行为或者确定要阻塞Redis服务器所有客户端的情况下才运行此命令。
事实上,将该命令更名为一些不太可能意外运行的名称可能符合你的利益。
127.0.0.1:6379> SHUTDOWN
如果您尚未配置任何保存点,但仍希望Redis执行保存操作,请将SAVE
选项附加到SHUTDOWN
命令中。
127.0.0.1:6379> SHUTDOWN SAVE
如果你已经配置了至少一个保存点,但是想要关闭Redis服务器而不执行保存操作,你可以在命令中添加NOSAVE
参数。
127.0.0.1:6379> SHUTDOWN NOSAVE
请注意,随着时间的推移,追加方式的文件可能变得非常长。但是,您可以通过编辑redis.conf
文件来配置Redis根据特定变量重写文件。您还可以通过运行BGREWRITEAOF
命令来指示Redis重写追加方式的文件。
127.0.0.1:6379> BGREWRITEAOF
BGREWRITEAOF
将创建一个最短的命令集,用于将数据库恢复到其当前状态。正如该命令的名称所暗示的那样,它将在后台运行。然而,如果另一个持久性命令已经在后台进程中运行,那么在执行BGREWRITEAOF
命令之前,Redis必须等待该命令完成。
结论
本指南详细介绍了用于管理数据库和密钥的多个命令。如果您在本指南中还想了解其他相关的命令、参数或步骤,请在评论中提问或进行建议。
更多关于Redis命令的信息,请查阅我们关于如何管理Redis数据库的教程系列。