【Java进阶营】Redis的持久化策略
如何保证Redis宕机之后重启可以将数据进行恢复?一般需要定时进行持久化将内存中的数据写入到硬盘中。Redis支持两种不同的持久化机制:RDB持久化以及AOF持久化。
RDB持久化(全量备份)
RDB持久化是指在指定时间间隔内将内存中的数据集快照写入磁盘。实际上fork子线程,先将数据集写入临时文件,写入成功后,在替换之前的文件,用二进制压缩文件,RDB是Redis默认的持久化方式,会在对应目录下生产一个dump.rdb文件,重启会通过加载dump.rdb文件恢复数据。
RDB优点:
方便持久化:只有一个dump.rdb文件;
容灾性好:一个文件可以保存到安全的磁盘;
性能好:fork子线程来完成写操作,主线程继续处理命令;
效率高:如何数据集偏大,RDB启动效率比AOF高
RDB缺点:
数据安全性低:因为RDB是每隔一段时间进行持久化,可能会造成数据丢失。在此我向大家推荐一个架构学习交流圈。交流学习指导伪鑫:1253431195(里面有大量的面试题及答案)里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多
由于RDB是通过fork子线程协助完成数据持久化工作的,因此如果数据集较大时,可能会导致整个服务停止服务几百毫秒,甚至一分钟。
AOF持久化(增量备份)
AOF持久化是以日志的形式记录记录每一个增删操作然后追加到文件中。AOF的出现是为了弥补RDB备份的不足(数据不一致性)。
与RDB持久化相比,AOF的持久化实时性更好。
AOF的备份策略:
Redis的配置文件中存在三种不同的AOF持久化方式:
appendfsync always:每次有数据修改发生时都会同步。
appendfsync everysec:每秒同步一次
appendsync no:让操作系统决定何时进行同步。
AOF优点:
AOF实时性哈好,数据安全性更高;
AOF通过append模式写文件,即使中途服务器宕机,也可以通过redis-check-aof工具解决数据一致性问题。
AOF机制的rewrite模式(文件过大会对命令进行合并重写),可以删除其中某些命令(比如误操作的命令)
AOF缺点:
AOF文件比RDB文件大,且恢复慢;
根据同步策略的不同,AOF在运行效率上往往会慢于RDB。