redis数据持久化

一、RDB

  1. RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘。

    • 默认的持久化方式,这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。
    • 可以配置redis在n秒内如果超过m个key被修改就自动做快照:
    1
    2
    3
    4
    save 900 1     #900秒内如果超过1个key被修改,则发起快照保存
    save 300 10 #300秒内容如超过10个key被修改,则发起快照保存
    save 60 10000 #60秒内容如超过10k个key被修改,则发起快
    照保存
  2. RDB文件保存过程

    • redis调用fork,现在有了子进程和父进程。
    • 父进程继续处理client请求,子进程负责将内存内容写入到临时文件。
    • 由于操作系统(os)的写时复制机制(copy on write)父子进程会共享相同的物理页面,当父进程处理写请求时os会为父进程要修改的页面创建副本,而不是写共享的页面。所以子进程的地址空间内的数据是fork时刻整个数据库的一个快照。
    • 当子进程将快照写入临时文件完毕后,用临时文件替换原来的快照文件,然后子进程退出。
    • client 也可以使用save或者bgsave命令通知redis做一次快照持久化。save操作是在主线程中保存快照的,由于redis是用一个主线程来处理所有client的请求,这种方式会阻塞所有client请求。所
    • 另一点需要注意的是,每次快照持久化都是将内存数据完整写入到磁盘一次,并不是增量的只同步脏数据。如果数据量大的话,而且写操作比较多,必然会引起大量的磁盘io操作,可能会严重影响性能。

    二、AOF

    1. AOF持久化以日志的形式记录服务器所处理的每一个写操作,读操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。
    • 在Redis的配置文件中存在三种同步方式,它们分别是:
    1
    2
    3
    appendfsync always     #每次有数据修改发生时都会写入AOF文件。
    appendfsync everysec #每秒钟同步一次,该策略为AOF的缺省策略。
    appendfsync no #从不同步。高效但是数据不会被持久化。
  3. AOF文件保存过程

    • redis会将每一个收到的写命令都通过write函数追加到文件中(默认是 appendonly.aof)。
    • 当redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。