redis共有两种持久化策略
- RDB(redis dataBase)
- AOF(append only file)
RDB
RDB是redis默认
的持久化策略,当redis中的写操作达到指定的次数、同时距离上⼀次
持久化达到指定的时间就会将redis内存中的数据生成数据快照,保存在指定的rdb文件中
通过修改redis.conf⽂件,来设置RDB策略的触发条件
## rdb持久化开关
rdbcompression yes
## 配置redis的持久化策略
save 900 1
save 300 10
save 60 10000
## 指定rdb数据存储的⽂件
dbfilename dump.rdb
缺点如下:
RDB 存在数据丢失的风险:因为 RDB 使用的是数据快照的形式进行持久化,所以在 Redis 出现故障而没有进行持久化时,会丢失上一次持久化之后的操作数据。
RDB 不适合实时性持久化:由于 RDB 是以数据快照的形式进行持久化,所以在保存快照时需要耗费一定的时间,不能实现实时性持久化。
RDB 执行时间过长会导致 Redis 卡顿:由于在执行持久化操作时,需要进行 fork 子进程来进行数据快照的生成,如果数据量较大,则 RDB 子进程可能会执行过长的时间,过长的执行时间可能导致 Redis 卡顿或者崩溃等问题。因此,不宜将 save 时间周期设置过短。
优点如下:
在
数据量较小
的情况下,执行速度比较快:由于 RDB 是以数据快照的形式进行持久化,所以在数据量较小的情况下,RDB 的执行速度比较快。可以通过拷贝 rdb 文件轻松实现 Redis 数据移植:由于 RDB 文件保存了 Redis 数据库在某个时间点的数据状态,因此可以通过拷贝 rdb 文件的方式,轻松实现 Redis 数据库的数据移植操作,这也是 RDB 的一个优点。
说明:RDB 方式中,当 Redis 需要进行数据快照时,会创建一个子进程
,负责将当前内存中的数据状态保存到一个二进制
文件中。子进程保存完数据后,会将数据文件重命名为一个与时间戳
有关的文件,这样就可以快速地找到某个时间点
上的数据快照
fork 子进程?
在 Redis 中,当需要执行 RDB 持久化操作时,就会调用 fork
创建一个子进程来进行数据快照的生成。父进程和子进程的代码执行位置以及数据内容都是相同的,但是子进程获取到了一个新的进程 ID。根据操作系统的写时复制(Copy-On-Write)机制
,当子进程需要修改数据时,才会复制一份数据副本,如果没有修改数据,就会共享父进程的数据。这种机制可以避免子进程一开始复制大量数据而导致性能下降。
所以根据写时复制机制可推知,RDB是一个时间节点一个时间节点的保存数据的,每一个时间节点对应redis在这段时间内的n次修改操作
AOF
Apeend Only File,当达到设定触发条件时,将redis执行的写操作指令存储在aof⽂件中,Redis默认未开启aof持久化
配置:
## 开启AOF
appendonly yes
## 设置触发条件(三选⼀)
appendfsync always ## 只要进⾏成功的写操作,就执⾏aof
appendfsync everysec ## 每秒进⾏⼀次aof
appendfsync no ## 让redis执⾏决定aof
## 设置aof⽂件路径
appendfilename "appendonly.aof"
区别:
RDB 和 AOF 都是 Redis 所采用的持久化方式,它们有以下几点不同:
存储格式不同:RDB 以二进制格式存储数据,AOF 以文本格式存储 Redis 执行的写操作。
恢复速度不同:RDB 恢复速度相对较快,因为 RDB 文件中直接存储了快照数据,Redis 读取该文件时只需要将数据读入内存即可。而 AOF 恢复速度相对较慢,因为需要依次执行 AOF 文件中的写操作才能恢复数据。
数据完整性不同:RDB 有可能会丢失一些数据,例如在两次 RDB 快照之间出现的数据未被保存。而在 AOF 持久化方式下,每个写操作都会被记录到 AOF 文件中,数据的完整性更好。
操作效率不同:AOF 持久化方式下,每次写操作都会被立即记录到 AOF 文件中,造成了一定的性能开销。而 RDB 快照方式下,则只会在快照生成时进行一次性的写操作,写操作效率更高。
Redis 官方建议在同时存在 AOF 文件和 RDB 文件的情况下,优先使用 AOF 持久化方式。AOF 持久化记录了每一个写操作
的命令,因此具有更好的数据完整性
和灵活性,能够避免数据丢失。这意味着 Redis 在启动时会首先
检查 AOF 文件,如果存在则会根据其中的写操作命令逐个执行以还原数据。只有在 AOF 文件不存在
或者发生错误的情况下,Redis 才会考虑使用 RDB 文件进行数据恢复。
因此,在 Redis 中同时开启 AOF 和 RDB 可以最大程度
地提高数据的完整性和高可用性