Redis 持久化机制
概念: 通过持久化机制(RDB、AOF)把内存中的数据同步到硬盘中来保证数据持久化;当 redis 重启后把硬盘文件重新加载到内存,就能达到恢复数据的目的。
实现: 单独创建fork的一个子进程,将父进程的数据库复制到子进程的内存中,然后由子进程写入到临时文件中,持久化结束了再用这个临时文件替换上次的快照文件,然后子进程退出,内存释放。
RDB(Redis DataBase): rdb是redis默认的持久化方式,按照一定周期策略把内存的数据以快照方式保存到硬盘中(二进制文件),即Snapshot快照存储,对应将产生dump.rdb数据文件,通过配置文件中的save参数来决定快照的周期
优点:
1、适合大规模的数据恢复!
2、对数据的完整性要不高!
缺点:
1、需要一定的时间间隔进程操作!如果redis意外宕机了,这个最后一次修改数据就没有的了!
2、fork进程的时候,会占用一定的内容空间!
AOF(Append Only File): Redis会将每个收到的命令都通过write函数追加到文件最后,类似于MySQL的binlog。当redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。
mysql-binlog是MySQL数据库的二进制日志,用于记录用户对数据库操作的SQL语句((除了数据查询语句)信息。可以使用mysqlbin命令查看二进制日志的内容。
Tips:
- 当两种方式同时开启时,数据恢复redis会优先选择AOF恢复
- 如果这个 aof 文件有错误,这时候 redis 是启动不起来的吗,我们需要修复这个aof文件 redis 给我们提供了一个工具redis-check-aof --fix
优点:
1、每一次修改都同步,文件的完整会更加好!
appendfsync always # 每次修改都会 sync。消耗性能
2、每秒同步一次,可能会丢失一秒的数据
appendfsync everysec # 每秒执行一次 sync,可能会丢失这1s的数据! #
3、从不同步,效率最高的!
appendfsync no # 不执行 sync,这个时候操作系统自己同步数据,速度最快!
缺点:
1、相对于数据文件来说,aof远远大于 rdb,修复的速度也比 rdb慢!
2、Aof 运行效率也要比 rdb 慢,所以我们redis默认的配置就是rdb持久化