持久化过程
- 客户端向服务端发送写操作(数据在客户端内存中)
- 服务端接收到请求(数据在服务端内存上)
- 服务端调用write系统调用,准备写往磁盘(数据在系统内存缓冲区)
- os将数据从内存缓存转移到磁盘控制器上(数据在磁盘缓存上)
- 磁盘控制器将数据写到磁盘上(数据在磁盘上)
RDB持久化
定义:在指定的时间间隔内将内存中的数据集快照写入磁盘
原理:到时后redis调用一个子进程
劣势:每次快照持久化都是将内存数据完整写入到磁盘一次,并不是增量的同步,所以量大的情况下会严重影响性能
AOF文件保存过程
redis将每一个收到的写命令通过write函数追加到文件中(默认是 appendonly.aof)
当redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容
aof带来的问题:文件会越来越大,但是其实很多记录是可以去除掉的
bgrewriteaof:
- redis调用fork
- 子进程根据内存快照,写入重建数据库的命令到新aof文件
- 父进程继续处理client请求,除了把命令写到原来的aof文件,并将命令缓存起来
- 待子进程处理接受后,父进程将缓存的命令也写入新的aof文件
- 用新aof文件替换旧aof文件