redis有两种持久化机制:RDB(快照)和AOF(日志)
COPY ON WRITE机制:当前数据正在进行处理(比如制作快照或者进行AOF重写)的时候,如果有新的请求需要修改数据,那么就用到了写时复制技术。即将数据复制一份出来,然后在复制的数据上面进行修改。等到前面的处理流程结束后,可以把这份复制出来的数据写回去,或者直接指向这块新的内存。
父进程fork子进程的时候,用到COW,意思是,原本新fork出来的子进程是共享父进程的数据的,只有当父进程或者子进程修改数据的时候,才复制一份出来,在复制的数据上修改。(这里不需要覆盖原数据!)
1、RDB
RDB周期性的把redis当前内存中的全部数据写到磁盘上的一个快照文件中。其中,为了防止磁盘IO影响redis处理读写请求的速度,主进程fork一个子进程异步制作快照。
COPY ON WRITE:子进程制作快照时,父进程仍然可以处理redis的读写请求,如果需要修改数据,则需要把要修改的内存页复制一份,对这个复制页进行修改,也就是说,快照要保存的内容在它被创建的那一刻已经固定下来了。
2、AOF
AOF使用日志按顺序存储所有修改指令。每次接收到修改指令,先把该指令存储到AOF日志文件中,然后再执行该修改指令。redis宕机后重启后,把AOF文件中的指令按顺序重新执行一次,就可以恢复到宕机之前的状态。一般每秒fsync一次将日志写到磁盘,最多丢失一秒的数据。
AOF重写:redis执行的修改指令越多,AOF文件越大,那么重启后的恢复时间将会很耗时,因此需要做AOF重写。AOF重写就是主进程fork一个子进程遍历当前所有数据,转换成一系列redis指令(直接赋值),期间如果有新的用户写请求进来,就把这些修改指令缓存起来,追加到日志后面,然后用COPY ON WRITE的方式执行这些命令。
3、RDB+AOF混合持久化
内存数据用RDB方式持久化,期间到来的修改指令用AOF方式持久化。
4、对比
- | RDB | AOF |
---|---|---|
恢复速度 | 速度快,只需要复制数据即可 | 速度慢,要按顺序执行所有指令 |
数据丢失 | 每隔五分钟持久化一次,宕机会丢失5分钟数据 | 每秒持久化一次,宕机只丢失1秒数据 |
总的来说,RDB重启恢复速度快,但宕机时丢失的数据多,AOF重启恢复速度慢,但宕机时丢失的数据少。