持久化流程:
- 客户端向数据库发送写命令:数据在客户端的内存;
- 数据库接收到客户端的请求:数据在服务器的内存;
- 数据库调用系统API将数据写入磁盘:数据在内核缓冲区;
- 操作系统将写缓冲区传输到磁盘控制器:数据在磁盘缓存中;
- 操作系统的磁盘控制器将数据写入实际的物理媒介:数据在磁盘中;
持久化方式
RDB: 指定的时间间隔能对你的数据进行快照存储.
AOF: 记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以redis协议追加保存每次写的操作到文件末尾.Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大.
RDB
- 配置方式:
(1)手动触发快照:
save (阻塞客户端发送的请求)
bgsave (异步创建快照)
(2)自动触发:
save 900 2 (服务器在900秒之内,对数据库至少进行了2次修改的话,就会执行 bgsave命令)
save 300 20 (服务器在300秒之内,对数据库至少进行了20次修改的话,就会执行 bgsave命令)
- 原理:fork()是unix系统的一个api;
fork一个子进程, 子进程先共享父进程的数据;
当主进程数据有写入操作时, 触发copy on write , 此时给子进程分配物理空间,并将资源复制给子进程;
AOF
AOF(append only file): 记录redis操作的指令。会过滤掉无效指令;
AOF重写: 开辟一个子进程,对内存进行遍历,序列化到一个新的AOF日志文件
- 配置:
appendonly yes
#将 aof_buf缓冲区的所有内容写入并同步到AOF文件
appendfsync always
#将 aof_buf缓冲区的所有内容写入并同步到AOF文件,每秒执行一次
appendfsync everysec
#将 aof_buf缓冲区的所有内容写入到AOF文件,但何时同步由操作系统决定
appendfsync no
RDB与AOF对比:
RDB 优点:
- 是一个非常紧凑的二进制文件,恢复更快
RDB缺点:
- 会丢失指定时间间隔的数据
AOF优点:
- 实时持久化,数据安全性高
AOF缺点 :
- 由于是日志追加,体积要比RDB大。
- 数据量大时,恢复慢;
混合持久化
RDB会丢失部分数据,AOF日志重放要慢很多;
Redis4.0 为了解决这个问题, 采用了混合持久化的方式;
优点:混合持久化结合了 RDB 和 AOF 持久化的优点,开头为 RDB 的格式,使得 Redis 可以更快的启动,同时结合 AOF 的优点,又降低了大量数据丢失的风险。