redis支持两种持久化RDB和AOF
1.RDB(快照)持久化:保存某个时间点的全量数据快照。
以下为redis配置文件的配置
RDB的创建与载入:
1.SAVE:该指令会阻塞redis的主进程,直到rdb文件被创建。因为redis是由一个主进程来保证服务的,而次方法会阻塞redis的服务,所以一般我们不使用此方式生成文件。
2.BGSAVE:该指令会fork一个子进程来创建RDB文件,主进程继续接收客户端的服务,子进程持久化完成之后会发送给主进程一个通知,表示创建完成。而父进程在接收客户端的请求时,会有一定的时间间隔来轮询子进程的状态。我们也可以使用lastsave指令来查看最后一次执行BGSAVE的状态,以及最后一次执行成功的时间。
BGSAVE的原理,如下图
1)检查是否存在子进程正在执行rdb或aof持久化,如果有返回false.
2) 调用redis源码中的 bgsaveBackground方法,其中fork()方法会生成一个子进程执行rdb操作。
3)fork方法的 copy -on-write (写时拷贝技术)
RDB的缺点:
1)内存数据全量持久化,如果数据量过大,会由于I/O严重影响性能。
2)可能会因为redis服务宕机而导致,最近一次持久化到现在的数据丢失。
AOF(Append-only-file)持久化:保存写状态
AOF持久化是通过保存redis的写操作来记录数据的。相较于RDB来说,RDB持久化是通过保存数据库的状态来记录数据的,AOF则是通过保存数据库的写操作指令来记录的。