Redis RDB全称是什么?Redis RDB内存数据持久化操作方式

RDB的全称是Redis database

Redis在开始的操作都是基于内存的,所以性能很高,但是一旦程序关闭,数据就丢失了。

因此,我们需要在指定的时间间隔内将内存数据写入磁盘,也就是行话中的 Snapshot 快照。

恢复时,快照文件直接写入内存。

这也是 Redis 和 Memcached 的主要区别之一,因为 Memcached 没有持久化能力。

对于Redis内存数据的持久化,Redis 为我们提供了以下方法:

因为每个持久化方案都有特定的使用场景。

Redis RDB内存数据持久化操作方式

手动触发RDB

手动触发持久化有两种操作:savebgsave

它们的主要区别在于是否阻塞Redis主线程的执行。

1、save命令

在客户端执行save命令,会触发Redis的持久化,但也会使Redis处于阻塞状态,直到RDB持久化后才会响应其他客户端发送的命令,因此在生产环境中必须谨慎使用。

127.0.0.1:6379> save
OK
127.0.0.1:6379>

save 执行命令的过程如图 

2、bgsave 命令

与阻塞整个进程的save命令相比,bgsave命令显然更适合我们使用。

127.0.0.1:6379> bgsave
Background Saving started # 提示开始后台保存 
127.0.0.1:6379>

自动触发RDB

说完手动触发,再来看看自动触发。 我们可以在配置文件中配置自动触发的条件。

1、save m n

注意:当设置了多个save m n 命令时,任何一个条件都会触发持久化。

例如,我们设置下面两个save m n命令:

save 60 10
save 600 20

2、flushall

3、主从同步触发

Redis主从复制中,当从节点进行全量复制操作时,主节点会执行bgsave命令,将RDB文件发送给从节点,此过程自动触发 Redis 持久化。

Redis 可以通过命令查询当前的配置参数。

查询命令的格式为:config get xxx

例如,如果要获取 RDB 文件的存储名称设置,可以使用 config get dbfilename

执行效果如下:

127.0.0.1:6379> config get dbfilename
1) "dbfilename"
2) "dump.rdb"

由于Redis服务器在加载RDB文件时会阻塞,直到加载完成,可能会造成很长时间,网站无法访问。

若想手动删除Redis的RDB 缓存文件dump.rdb,可以使用以下命令,查找dump.rdb文件储存路径 ▼

find / -name dump.rdb

Redis设置RDB的配置

关于设置RDB的配置, 你可以使用以下两种方式:

  1. 手动修改Redis配置文件
  2. 使用命令行设置,config set dir “/usr/data”是修改RDB文件的存储命令

注意:redis.conf中的配置可以通过config get xxx获取,通过config set xxx value修改,而手动修改Redis配置文件的方法全局有效,即重启Redis服务器设置的参数不会丢失,而是使用命令修改那样,Redis 重启后就会丢失。

但是如果要手动修改Redis配置文件立即生效,需要重启Redis服务器,命令方式不需要重启Redis服务器。

RDB文件恢复

Redis服务器启动时,如果Redis根目录下存在RDB文件dump.rdb,Redis会自动加载RDB文件恢复持久化数据。

如果根目录下没有dump.rdb文件,请先将dump.rdb文件移动到Redis的根目录下。

当然,Redis启动时有日志信息,会显示RDB文件是否加载。

Redis服务器在加载RDB文件时会阻塞,直到加载完成。

现在我们知道RDB持久化分为手动触发和自动触发两种方式:

  1. 它的优点是存储文件小,启动Redis时数据恢复速度更快。
  2. 缺点是存在数据丢失的风险。

RDB文件的恢复也很简单,只需将RDB文件放在Redis的根目录下,Redis启动时就会自动加载和恢复数据。

RDB优缺点

1) RDB优点

RDB内容为二进制数据,占用内存少,更紧凑,更适合作为备份文件;

RDB对于灾难恢复非常有用,它是一个压缩文件,可以更快地传输到远程服务器,用于Redis服务恢复;

RDB可以大大提高Redis的运行速度,因为Redis主进程会Fork一个子进程来持久化数据到磁盘。

Redis主进程不进行磁盘I/O等操作;

与AOF 格式文件相比,RDB 文件的重启速度更快。

2) RDB的缺点

因为RDB只能保存一定时间间隔的数据,如果中间意外终止Redis服务,会丢失一段时间的Redis数据;

RDB需要频繁fork才能使用子入口将其保存在磁盘上的过程。

如果数据集很大,fork 可能会很耗时,如果数据集很大,CPU 性能很差,可能会导致 Redis 无法为客户端服务几毫秒甚至一秒。

当然,我们也可以禁用持久化来提高 Redis 的执行效率。

如果你对数据丢失不敏感,可以在客户端连接时通过执行 config set save "" 命令禁用 Redis 的持久化。

redis.conf中,如果在save开头注释掉所有配置,持久化也会被禁止,但一般不这么做。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注