Redis是一种基于内存的非关系型数据库,其大部分的操作都直接在内存中执行,而内存中的数据是不能持久储存的,如果服务器宕机关闭会导致内存中的数据丢失,因此Redis就需要将内存中的数据持久化到磁盘中,便于长久的保存。
Redis提供了两种持久化的方式:
RDB(Redis DataBase)AOF(Append Only File)RDB是Redis默认的持久化方法。按照一定的时间间隔将内存中的数据以快照的形式保存到磁盘中。Redis主进程会单独fork一个子进程来执行RDB持久化,整个过程中主进程不进行任何的IO操作,从而避免了对主进程造成性能的影响。在RDB持久化过程中,会先将数据写入一个临时的文件,等持久化结束后替换已持久化好的dump.rdb文件。
优点:
相比AOF,RDB适用于有比较大的据量的时候。性能最大化,通过fork子进程来完成持久化操作,对主进程的性能影响很小。缺点:
需要一定的时间间隔进行操作,如果意外宕机会导致最后时间间隔内的的数据丢失。fork子进程的时候,会占用一定的内存空间与RDB通过快照方式持久化不同,AOF是通过日志的形式来记录每个写操作的。在redis执行过程中,AOF会将所有写操作指令记录下来,追加到日志文件的末尾。默认每秒写入一次,配置文件中可设置成:每次修改都同步、每秒同步、不同步三种情况。
注:当两种持久化方式同时开启的时候,Redis的数据恢复会优先选择AOF进行恢复。
优点:
数据的完整性更好。相比于RDB,AOF可以将每条指令都记录下来,即使服务器意外宕机,也不会丢失数据。redis自带了修复工具redis-check-aof。即使AOF记录的指令出错,比如说记录的时候服务器宕机导致写入了不完整的数据,也能用redis-check-aof进行修复。缺点:
AOF持久化文件比RDB文件大,恢复速度慢。数据量比较大的时候,AOF比RDB的启动效率更低。