RDB持久化
RDB持久化是Redis默认使用的持久化功能,该功能可以创建出一个经过压缩的二进制文件,其中包含了服务器在各个数据库中存储的键值对数据等信息。RDB持久化产生的文件都以.rdb后缀结尾,其中rdb代表Redis DataBase(Redis数据库)。
SAVE:阻塞服务器并创建RDB文件
用户可以通过执行SAVE命令,要求Redis服务器以同步方式创建出一个记录了服务器当前所有数据库数据的RDB文件。
创建新的RDB文件,并替换已有的RDB文件
BGSAVE:以非阻塞方式创建RDB文件
BGSAVE不会直接使用Redis服务器进程创建RDB文件,而是使用子进程创建RDB文件。
执行的操作
1)创建一个子进程。
2)子进程执行SAVE命令,创建新的RDB文件。
3)RDB文件创建完毕之后,子进程退出并通知Redis服务器进程(父进程)新RDB文件已经完成。
4)Redis服务器进程使用新RDB文件替换已有的RDB文件。
由于执行BGSAVE命令需要创建子进程,所以父进程占用的内存数量越大,创建子进程这一操作耗费的时间也会越长,因此Redis服务器在执行BGSAVE命令时,仍然可能会由于创建子进程而被短暂地阻塞。
通过配置选项自动创建RDB文件
save <seconds> <changes>
save选项接受seconds和changes两个参数,前者用于指定触发持久化操作所需的时长,而后者则用于指定触发持久化操作所需的修改次数。
为了避免由于同时使用多个触发条件而导致服务器过于频繁地执行BGSAVE命令,Redis服务器在每次成功创建RDB文件之后,负责自动触发BGSAVE命令的时间计数器以及修改次数计数器都会被清零并重新开始计数:
数据丢失
因为SAVE命令是一个同步操作,它的开始和结束都位于同一个原子时间之内,所以如果用户使用SAVE命令进行持久化,那么服务器在停机时将丢失最后一次成功执行SAVE命令之后产生的所有数据。
RDB持久化是一种全量持久化操作,它在创建RDB文件时需要存储整个服务器包含的所有数据,并因此消耗大量计算资源和内存资源,所以用户是不太可能通过增大RDB文件的生成频率来保证数据安全的。
AOF持久化
AOF提供的是增量式的持久化功能,这种持久化的核心原理在于:服务器每次执行完写命令之后,都会以协议文本的方式将被执行的命令追加到AOF文件的末尾。服务器在停机之后,只要重新执行AOF文件中保存的Redis命令,就可以将数据库恢复至停机之前的状态。
开启AOF持久化
appendonly <value>
设置AOF文件的冲洗频率
appendfsync<value>
always——每执行一个写命令,就对AOF文件执行一次冲洗操作。
·everysec——每隔1s,就对AOF文件执行一次冲洗操作。
·no——不主动对AOF文件执行冲洗操作,由操作系统决定何时对AOF进行冲洗。
AOF重写
Redis提供了AOF重写功能,该功能能够生成一个全新的AOF文件,并且文件中只包含恢复当前数据库所需的尽可能少的命令。
BGREWRITEAOF命令
BGREWRITEAOF命令是一个异步命令,Redis服务器在接收到该命令之后会创建出一个子进程,由它扫描整个数据库并生成新的AOF文件。当新的AOF文件生成完毕,子进程就会退出并通知Redis服务器(父进程),然后Redis服务器就会使用新的AOF文件代替已有的AOF文件,借此完成整个重写操作。
AOF重写配置选项
auto-aof-rewrite-min-size <value> #用于设置触发自动AOF文件重写所需的最小AOF文件体积,
当AOF文件的体积小于给定值时,服务器将不会自动执行BGREWRITEAOF命令。在默认情况下,该选项的值为:auto-aof-rewrite-min-size 64mb
auto-aof-rewrite-percentage <value> # 示如果当前AOF文件的体积比最后一次AOF文件重写之后的体积增大了一倍(100%),那么将自动执行一次BGREWRITEAOF命令。
RDB-AOF混合持久化
设置选项
aof-use-rdb-preamble <value>
选项的值设置成了yes,那么Redis服务器在执行AOF重写操作时,就会像执行BGSAVE命令那样,根据数据库当前的状态生成出相应的RDB数据,并将这些数据写入新建的AOF文件中,至于那些在AOF重写开始之后执行的Redis命令,则会继续以协议文本的方式追加到新AOF文件的末尾,即已有的RDB数据的后面。