redis之五 持久化机制(AOF和RDB)

版权声明:本文为博主原创文章,版权归博主所有。如转载,请注明出处! https://blog.csdn.net/javandroid/article/details/80857484

redis中文官网:redis持久化

redis支持两种持久化方式:RDB方式和AOF方式

一、RDB方式

在默认情况下,Redis将数据库快照保存在名字为dump.rdb的二进制文件中。你可以对Redis进行设置,让它在“N秒内数据集至少有M个改动”这一条件被满足时,自动保存一次数据集。你也可以通过调用SAVE或者BGSAVE,手动让Redis进行数据集保存操作。

save 60 1000   //60秒内有至少有1000个键被改动时,自动保存一次数据集

DRB工作原理
当 Redis 需要保存 dump.rdb 文件时, 服务器执行以下操作:

  • Redis 调用forks. 同时拥有父进程和子进程。
  • 子进程将数据集写入到一个临时 RDB 文件中。
  • 当子进程完成对新 RDB 文件的写入时,Redis用新RDB文件替换原来的RDB文件,并删除旧的 RDB 文件。

RDB在保存RDB文件时父进程唯一需要做的就是fork出一个子进程,接下来的工作全部由子进程来做,父进程不需要再做其他IO操作,所以RDB持久化方式可以最大化redis的性能。这种工作方式使得 Redis 可以从写时复制(copy-on-write)机制中获益。

二、AOF方式(Append-only file)

Redis默认没有开启AOF方式的持久化,可以通过appendonly参数开启。

appendonly yes

开启AOF持久化后每执行一条更改Redis中的数据的命令,Redis就会将改命令写入到硬盘的AOF文件中。AOF文件的保存位置与RDB文件的保存位置相同,都是可以通过dir参数设置的,默认的文件名是appendonly.conf,可以通过appendfilename参数修改:

appendfilename appendonly.aof

默认情况下系统每30秒回执行一次同步操作,以便将硬盘缓存中的内容真正地写入硬盘,在这30秒的过程中如果系统异常退出则会导致硬盘缓存中的数据丢失。

AOF工作原理
AOF 重写和 RDB 创建快照一样,都巧妙地利用了写时复制机制:

  • Redis fork出一个子进程。
  • 子进程开始将新AOF文件的内容写入到临时文件。
  • 对于所有新执行的写入命令,父进程一边将它们累积到一个内存缓存中,一边将这些改动追加到现有 AOF文件的末尾,这样即使在重写的中途发生停机,现有的 AOF 文件也还是安全的。
  • 当子进程完成重写工作时,它给父进程发送一个信号,父进程在接收到信号之后,将内存缓存中的所有数据追加到新 AOF 文件的末尾。
  • 搞定!现在 Redis 原子地用新文件替换旧文件,之后所有命令都会直接追加到新 AOF 文件的末尾。

三、如何选择使用哪种持久化方式?

如果可以承受数分钟以内的数据丢失,那么可以只使用 RDB 持久化。

官方并不推荐只使用AOF持久化这种方式:因为定时生成RDB快照(snapshot)非常便于进行数据库备份, 并且RDB恢复数据集的速度也要比 AOF 恢复的速度要快, 除此之外,使用 RDB 还可以避免之前提到的AOF程序的bug。

猜你喜欢

转载自blog.csdn.net/javandroid/article/details/80857484