【Redis】持久化:RDB与AOF

163 阅读3分钟

以下总结学习自小破站视频:www.bilibili.com/video/BV1S5…

方式一:RDB

指定的时间间隔内将内存中的数据集快照写入磁盘,也就是进行Snapshot快照,恢复时将快照文件直接读到内存里

Redis会单独创建一个(fork)一个子进程进行持久化,会先将数据写入到一个临时文件中,待持久化过程结束后,再用这个临时文件替换上次的持久化文件。

整个过程中主进程是不会进行任何IO操作,保持了极高的性能

redis默认持久化方式

image.png

指定的时间间隔的配置方法

redis.conf文件的SNAPSHOTTING有以下配置:

#如果900s内,至少有1个key进行了修改,则会进行持久化操作 
save 900 1 

#如果300s内,至少有10个key进行了修改,则会进行持久化操作 
save 300 10 

#如果60s内,至少有10000个key进行了修改,则会进行持久化操作 
save 60 10000

RDB的其他相关配置

#持久化失败了还是否会继续工作 
stop-writes-on-bgsave-error yes 

#是否压缩rdb文件,rdb文件即为持久化后的文件 
rdbcompression yes 

#保存rdb文件时是否校验 
rdbchecksum yes 

#rdb持久化文件 
dbfilename dump.rdb 

#rdb文件保存的目录 
dir ./

疑问

如何触发持久化机制,生成持久化文件dump.rdb?有以下3种方法

  1. 配置文件中SNAPSHOTTING save字段规则满足的情况
  2. 执行flushall命令
  3. 退出redis

flushall后,如何恢复(导出)rdb文件里面保存的数据?

把rdb文件放在redis启动目录,正常启动就回去load rdb文件

优点

  1. 适合大规模的数据恢复
  2. 对数据完整性要求不高

缺点

  1. 需要一定的时间间隔进行操作,如果redis意外宕机则会导致最后一次修改的数据丢失
  2. fork进程的时候,会占用一定内存空间

方式二:AOF

以日志的形式来记录每个写操作,将redis执行过的所有指令记录下来(读操作不记录),只会追加文件但不会改写文件

redis启动会读取该文件重构数据,即把日志文件记录的指令执行一遍以完成数据恢复

需要在redis.conf文件中打开,否则会默认会使用RDB的方式进行持久化

#默认为关,设为yes表示使用AOF持久化
appendonly no 

#aof持久化文件 
appendfilename "appendonly.aof" 

AOF3种同步数据的方式

# appendfsync always #每次修改都会同步,消耗性能 

appendfsync everysec #每秒进行sync一次,可能会丢失这1s的数据 

# appendfsync no #不执行同步,操作系统自己同步数据

优点

  1. 每一次修改都可以同步,文件的完整性会更好
  2. 每秒同步一次,可能会丢失一次数据
  3. 从不同步,效率最高

缺点

  1. aof文件比rdb大很多,恢复需要更多时间
  2. aof运行效率比rdb慢

如果aof或者rdb文件有错误,会导致redis启动失败,可以使用以下工具修复错误文件

image.png

image.png