RDB的全称是Redis database
。
Redis在开始的操作都是基于内存的,所以性能很高,但是一旦程序关闭,数据就丢失了。
因此,我们需要在指定的时间间隔内将内存数据写入磁盘,也就是行话中的 Snapshot 快照。
恢复时,快照文件直接写入内存。
这也是 Redis 和 Memcached 的主要区别之一,因为 Memcached 没有持久化能力。
对于Redis内存数据的持久化,Redis 为我们提供了以下方法:
因为每个持久化方案都有特定的使用场景。
Redis RDB内存数据持久化操作方式
手动触发RDB
手动触发持久化有两种操作:save
和bgsave
。
它们的主要区别在于是否阻塞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的配置, 你可以使用以下两种方式:
- 手动修改Redis配置文件
- 使用命令行设置,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持久化分为手动触发和自动触发两种方式:
- 它的优点是存储文件小,启动Redis时数据恢复速度更快。
- 缺点是存在数据丢失的风险。
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
开头注释掉所有配置,持久化也会被禁止,但一般不这么做。