引言

Redis的持久化分为两种:RDB(redis database)与AOF(Append Only File)。

  • RDB
    在指定的时间间隔内将内存中的数据集快照写入磁盘,或者手动执行SAVE\BGSAVE进行持久化操作。
  • AOF
    保存Redis服务器所执行的写命令来记录数据库状态。

1、RDB

  • 优点
    节省磁盘空间,恢复速度快
  • 缺点
    虽然Redis在fork时使用了写时拷贝技术,但是如果数据庞大时还是比较消耗性能。
    备份周期在一定间隔时间做一次备份,所以如果Redis意外down掉的话,就会丢失最后一次快照后的所有修改。

2、AOF

  • 优点
    备份机制更稳健,丢失数据概率更低。
    可读的日志文本,通过操作AOF文件,可以处理误操作。
  • 缺点
    比起RDB占用更多的磁盘空间。
    恢复备份速度要慢。
    每次读写都同步的话,有一定的性能压力。

3、注意

  • RDB、AOF文件同时存在时,服务器会根据AOF文件恢复,因为对于服务器来说,AOF的备份数据更完整。(考虑了意外宕机的情况)。
  • AOF日志sync属性的配置,如果不要求性能,在每条写指令时都sync一下磁盘,就不会丢失数据。
    但是在高性能的要求下每次都sync是不现实的,一般都使用定时sync,比如1s1次,这个时候最多就会丢失1s的数据

4、选取

建议两个都开启,如果对数据不敏感可以单独用RDB,如果只用来做缓存,可以都不开启。

5、RDB的save和bgsave区别

  • 两个都是手动持久化的方式。
  • save会占用主线程,此时只管保存,其他操作全部阻塞。
  • bgsave是开通一个fork子线程,redis通过创建子进程来进行RDB操作。

cow指的是copy on write,子进程创建后,父子进程共享数据段,父进程继续提供读写服务,写脏的页面数据会逐渐和子进程分离开来。

tencent.jpg