Redis 的持久化机制
Posted offerNotFound
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis 的持久化机制相关的知识,希望对你有一定的参考价值。
Redis 有两种持久化机制:RDB 和 AOF,其中 RDB 是 Redis 默认采用的持久化机制。
RDB
通过BGSAVE
(通知当前 Redis 的主进程去fork
出一个子进程,利用子进程去做持久化的事)命令触发,以快照的形式将数据持久化到硬盘当中。
大致流程如下:
BGSAVE
命令触发后,如果已经有子进程就会直接返回,没有就会通知父进程去创建一个子进程- 父进程去创建子进程(
fork
时会产生阻塞,但时间会比较短暂) - 子进程创建过后,父进程就继续去响应其他的命令
- 子进程去将父进程内存里的数据存储到 RDB 文件里(用写时复制的技术来解决子进程持久化与父进程响应其他命令的冲突)
- 完成后,子进程通知父进程去替换旧的 RDB 文件
写时复制技术:在对同一页要同时进行读和写时,会去复制一个副本出来,写就去写在副本里,等子进程把这一页写到硬盘上后就可以被副本替代了
AOF
以独立日志的方式,记录每次写入的命令。它的实时性比较好,在保证性能的前提下,它最多只会丢失1秒的数据(刷盘频率)。同时它比 RDB 文件体积大,但可以通过重写机制压缩 AOF 文件体积。
大致流程:
- 当向 Redis 里写入数据时,Redis 会先把这把命令写到的缓冲区里,缓冲区会定期刷盘到 AOF 文件里
- 当重启服务需要回复数据时,需要从 AOF 文件里读取数据
重写机制流程:
bgrewriteaof
命令触发后(自动触发),如果已经有子进程在重写了就返回,如果此时正在 RDB 持久化的话就推迟创建子进程- 父进程 fork 出子进程后,父进程就可以继续响应命令写向缓冲区里写入,子进程则去往新的 AOF 文件里写数据(子进程在创建的那一刻是有和父进程共享内存的)
- 子进程写完后通知父进程去替换旧的 AOF 文件
以上是关于Redis 的持久化机制的主要内容,如果未能解决你的问题,请参考以下文章