简介
由于Redis是基于内存的数据库,如果不将内存中数据库状态保存在磁盘中,那么一旦数据服务器进程退出,服务器中的数据库状态就会消失,所以Redis提供了持久化功能,将数据由内存持久化到文件中。 有两种持久化方式: RDB AOF 下面就会介绍这两种持久化方式
RDM
1.什么是RDM
RDB,全称Redis DataBase,在指定的时间间隔内将数据集快照写入到磁盘中,在恢复数据的时候将这些快照文件读取到内存中,对应的配置文件中的SNAPSHOTTING。
Redis会单独创建出一个子进程fork,fork就是复制一个和当前一模一样的进程作为原进程的子进程来进行持久化,fork会将数据写入到一个临时文件中,待持久化操作结束之后,临时文件会将已经持久化完成的文件替换掉,在这个过程中,主进程不进行任何IO操作,这也就确保RDB极高的性能,相比于RDB和AOF,RDB的模式会比AOF更加的高效。如果在进行大数据恢复,并且对于数据的精度要求不高,那么就可以使用RDB,Redis的持久化默认的也是RDB,在一般情况下(生产环境)不需要修改这个配置。
默认情况下, Redis 将数据库快照保存在名字为 dump.rdb的二进制文件中。文件名可以在配置文件中进行自定义,有时候在生产环境我们会将这个文件进行备份!
2.RDB的触发机制
1、满足配置文件的save规则的情况下,会自动触发RDB规则 2、执行FLUSHALL命令,也会触发RDB规则,但是没有意义,因为文件内容为空 3、退出Redis,也会产生dump.rdb文件(退出Redis默认执行save命令) 4、在客户端中使用save或者bgsave命令,也可以触发RDB规则但是这两种规则有所不同 save命令会完全占用当前进程去进行持久化操作,也就是说,save命令只管保存,不管其他,只要有进程过来,一律阻塞 bgsave命令会在后台运行,手动fork子进程进行操作,并且还会相应客户端的请求
3.RDB的数据恢复
1、首先使用一个Redis命令查看持久化文件保存的位置 2、然后将dump.rdb文件放到Redis的启动目录下即可
4.RDB的优缺点
优点: 1、适合大规模数据修复。 2、对数据精度要求不高。 缺点: 1、在持久化的时候需要一定的时间间隔,如果在一定的间隔时间内服务器意外宕机,那么就会丢失最后一次持久化的数据。 2、因为RDB持久化是需要fork出一份子进程进行IO操作的,也就是说,在原本的进程当中再复制出一个一模一样的进程作为子进程在内存中运行,内存的承载就会变为原来的两倍。
AOF
1.什么是AOF
Redis的另一种持久化方式,AOF,全名为Append Only File,它用日志的形式来记录每一个写操作,将Redis执行过的命令进行记录(读操作不记录),只追加文件,不改写文件。Redis在启动时会自动加载AOF持久化的文件重新构建数据,也就是Redis重启会把AOF持久化文件中的信息从前到后执行一次以完成数据的恢复。
AOF持久化对应的配置文件的位置是APPEND ONLY MODE
2.启动AOF
修改完配置之后,只需重新启动就可。如果说appendonly.aof文件的内容发生了一些错误,那么在Redis进行启动时,会出现问题。 Redis的AOF持久化保存的文件名称就叫做appendonly.aof
这里有一个小细节需要注意:如果AOF和RDB模式在配置文件中都有开启的话,为了保证数据的安全性,在Redis启动时会优先使用AOF。
3.修复AOF文件
如果appendonly.aof内部发生错误,Redis中提供了一个可以修复aof文件的修复工具叫做redis-check-aof
4.AOF重写规则
重写就是把能合并的命令合并,比如多次操作一个key,就可以合并成一个,无效的key的操作就可以全部删除。 Redis会将上一次重写的AOF文件大小进行记录,如果当前文件的大小超过源文件的一倍并且大小大于64M时就会触发重写操作。
5.AOF的优缺点
优点: 它支持同步记录和异步记录 ,对应的配置文件的属性如下:
appendfsync always # 同步记录,客户端中一有写操作,即刻记录,数据的完整性好,但是性能较差
appendfsync everysec # 异步记录,每秒记录一次,但是服务器如果在这一秒之内宕机,这一秒的数据就会丢失
appendfsync no # 不记录,效率也是最高的
缺点: 1、从恢复数据的角度来说,AOF所恢复的数据量一定是比RDB大,修复速度就会慢。 2、从恢复数据的时间的角度来说,AOF的时间也是大于RDB的。
RDB和AOF的选择
注意点: 1、RDB可以在指定的时间间隔内对数据集进行持久化快照存储。 2、AOF持久化记录每次客户端发送给Redis服务器的写操作,服务器中重启时会重新执行命令恢复原始数据,AOF持久化的每一次记录都会追加在文件的末尾,并且Redis有重写机制的存在使得AOF的文件被控制在合理的大小 3、如果Redis只做缓存,如果说只希望数据在服务器启动的时候存在,可以不使用任何的持久化方式 4、如果两种持久化同时开启,Redis服务器会默认先找AOF持久化,因为AOF的保存数据集要比RDB要完整,这也就是Redis考虑安全的原因。
|