RDB持久化 |
AOF持久化 |
全量备份,一次保存整个数据库 |
增量备份,一次保存一个修改数据库的命令 |
保存的间隔较长 |
保存的间隔默认一秒 |
数据还原速度快 |
数据还原速度一般 |
save会阻塞,但bgsave或者自动不会阻塞 |
无论是平时还是AOF重写,都不会阻塞 |
更适合数据备份,默认开启 |
更适合用来保存数据,和一般SQL持久化方式一样,默认关闭 |
启动优先级 : 低 |
启动优先级 : 高 |
体积 : 小 |
体积 : 大 |
恢复速度 : 快 |
恢复速度 : 慢 |
数据安全性 : 丢数据 |
数据安全性 : 根据策略决定 |
轻重 : 重 |
轻重: 轻 |
1、Redis持久化
RDB(Redis DataBase)------数据
AOF(AppendOnlyFiel)------命令
默认情况下,RDB开启,AOF关闭。
这两种形式都可以将存储在内存中的数据库数据以文件形式保存到硬盘中,防止数据丢失。文件位置:/var/lib/redis/6379
RDB持久化功能可以将服务器包含的所有数据库数据以二进制文件的形式保存到硬盘中,创建RDB类型的文件,默认为dump.rdb。服务器再次启动时会载入RDB文件,根据RDB文件的内容、还原服务器原有的数据库数据。
1.1 创建RDB文件方式
前两种需要用户手动执行,第三种有redis服务器自动执行
服务器执行客户端发送SAVE命令
服务器执行客户端发送BGSAVE命令
使用save配置选项设置的自动保存条件被满足,服务器自动执行BGSAVE
- SAVE命令
执行save命令的过程中,即创建RDB文件过程中,redis服务器将被阻塞,无法处理客户端发送的命令请求,只有在SAVE命令执行完毕之后,,服务器才重新开始处理客户端发送的命令请求。
如果RDB文件已经存在,那么服务器将自动使用新的RDB文件去代替旧的RDB文件。(为防止rdb文件丢失或被恶意篡改,可以设置定时将rdb文件转移到别的位置,文件命名标明保存时间)
- BGSAVE命令
执行bgsave命令同样会创建一个新的RDB文件,但这个命令执行过程中不会造成redis服务器阻塞。
【1、当redis服务器接受到BGSAVE命令时,他不会自动创建RDB文件,而是通过fork()来生成一个子进程,然后由子进程负责创建RDB文件,而自己继续处理客户端的命令请求 2、当子进程创建好RDB文件并退出时,他会向父进程(即负责处理命令请求的redis服务器)发送一个信号,告知他RDB文件已经创建完毕 3、最后redis服务器(父进程)解手子进程创建的RDB文件,BGSAVE执行完毕】
创建子进程会消耗额外的内存,所以SAVE创建RDB文件的速度会比BGSAVE块,可以集中资源来创建RDB文件。SAVE和BGSAVE没有孰好孰坏之分,如果数据库正在上线当中,用BGSAVE更好;而如果维护停机期间,则使用SAVE,因为此时系统阻塞也没关系,创建速度会更快,任务可以更快得完成。
自动创建RDB文件
默认redis.conf文件中为如下设置,可自行修改。只要三个条件满足任意一个,服务器就会执行BGSAVE。RDB文件创建后,服务器会将时间计数器和次数计数器清零,重新开始记录
save 900 1 :如果距离上次创建RDB文件已经过去了900秒,且服务器所有数据库总共已经发生了不少于1次修改,那么执行BGSAVE命令
save 300 10 :如果距离上次创建RDB文件已经过去了300秒,且服务器所有数据库总共已经发生了不少于10次修改,那么执行BGSAVE命令
save 60 10000:如果距离上次创建RDB文件已经过去了60秒,且服务器所有数据库总共已经发生了不少于10000次修改,那么执行BGSAVE命令
1.2 RDB持久化的缺点
创建RDB文件需要将服务器所有的数据库的数据保存起来,这是一个非常耗费资源和时间的操作,所以服务器需要隔一段时间才创建一个新的RDB文件,也就是说,创建RDB文件的操作不能执行得过于频繁,否则就会严重得影响服务器性能。
相比而言,AOF持久化的巨大优势就是用户可以根据自己的需要对AOF持久化进行调整,让redis在遭遇意外停机时不丢失任何数据,或者只丢失一秒钟的数据。
2、常见问题
1.在dump rdb过程中,aof如果停止同步,会不会丢失?
不会,所有的操作缓存在内存队列里,dump完后后,统一操作
2.aof重写是什么?
aof重写就是把内存中的数据逆化成命令,写入到aof文件,以解决aof日志过大的问题
3.如果rdb和aof文件都存在,优先使用谁恢复数据?
在这种情况下,当redis重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件完整
4.rdb和aof是否可以同时用?
可以,推荐同时使用
5.恢复时,rdb和aof哪个更快?
rdb快,因为rdb是数据的内存映射,直接载入到内存,而aof是命令,需要逐条执行
6.如何在不用【config set】命令的情况下,将Redis持久化由RDB切换到AOF
利用主从,从机配置AOF重启后,将生成的AOF文件复制至主机Redis数据目录,主机配置AOF后再重启。
注:在 Redis 2.2 或以上版本,通过【config set】可以在不重启的情况下,从 RDB 切换到 AOF。
1)为最新的 dump.rdb 文件创建一个备份。
2)将备份放到一个安全的地方。
3)执行以下两条命令: redis-cli> CONFIG SET appendonly yes redis-cli> CONFIG SET save ""
4)确保命令执行之后,数据库的键的数量没有改变。
5)确保写命令会被正确地追加到 AOF 文件的末尾。
步骤 3 执行的第一条命令开启了AOF功能:<font style="color:red">Redis会阻塞直到初始AOF文件创建完成为止</font>,之后Redis会继续处理命令请求, 并开始将写入命令追加到 AOF 文件末尾。
步骤 3 执行的第二条命令用于关闭RDB功能。这一步是可选的,如果你愿意的话,也可以同时使用RDB和AOF这两种持久化功能。
不过别忘了在redis.conf中打开AOF功能!否则的话,服务器重启之后,之前通过【CONFIG SET】设置的配置就会被遗忘,程序会按原来的配置来启动服务器。