Redis被称为是内存数据库,那是因为它会将其所有数据存储在内存里,因此Redis具有强劲的速度性能,但是,也正因为数据存储在内存中,当Redis重启后,所有存储在内存的数据就会丢失。为了使得数据持久化,Redis提供了两种方式:RDB方式和AOF方式。
一、RDB方式
RDB方式的持久化是通过快照(snapshotting)完成的,当符合一定条件时,Redis会自动将内存中所有的数据生成一份副本并存储在硬盘中,这个过程被称为“快照”。“快照”,就类似于拍照,摁下快门那一刻,所定格的照片,就称为“快照”。Redis有4种情况会对数据进行快照:
- 根据配置规则进行自动快照;
- 用户执行SAVE或BGSAVE命令;
- 执行FLUSHALL命令;
- 执行复制(replication)时。
1、根据配置规则进行自动快照
配置文件的自定义信息由两个参数决定:时间窗口M和改动的键的个数。
如配置:save 900 1
可以配置多个快照条件,每条快照条件都占一行,并且以save开头,上面这条表示900秒内有一个或一个以上的键被修改了,就进行快照。
2、用户执行SAVE或BGSAVE命令
在执行SAVE命令进行手动快照时,快照过程中会阻塞所有来自客户端的请求,当数据库数据比较多时,那么这一过程就会使得客户端等待较长的时间;相对的,执行BGSAVE命令时,则是采用异步快照,在进行快照过程中,依然响应来自客户端的请求。所以,比较常用的是BGSAVE命令。
3、执行FLUSHALL命令
当执行FLUSHALL命令时,Redis会清除数据库的所有数据。值得注意的是,清空数据库过程,相当于修改键,在这个过程中,只要自动快照条件不为空,Redis都会执行一次快照,换句话说,如果没有定义自动快照条件时,即使执行了FLUSHALL命令,也不会进行快照。
4、执行复制(replication)
当设置了主从模式时,Redis会在复制初始化时进行自动快照。这里跟FLUSHALL有区别,执行复制时,即使没有设置自动快照条件,也会进行快照操作,生成RDB格式文件。
快照原理:
Redis默认会将快照文件存储在Redis当前进程的工作目录中的dump.rdb文件中,可以配置 dir和dbfilename两个参数设置快照文件路径。快照过程:
(1) Redis使用fork函数复制一份当前进程的副本;
(2) 父进程(这里是当前进程)继续接收并处理客户端发来的命令,而子进程(副本)开始将内存中的数据写入硬盘中临时文件;
(3) 当子进程写完所有数据后,就用临时文件覆盖掉旧的RDB文件,至此,完成一次快照操作。
在fork函数执行的时候,操作系统会使用写时复制(copy-on-write)策略,即fork函数发生的那一刻,父子进程共享同一内存数据,当父进程要更改其中某片数据时,操作系统会将该片数据复制一份,以保证子进程不受影响,所以新的RDB格式文件保存的是执行fork那一刻的内存数据。因为使用了写时复制策略,使得在fork的时刻用了不到2倍的内存,就可以保存貌似两份的内存副本一样。
值得注意的是,当进行快照的过程中,如果写入操作较多,造成fork前后数据差异较大,是会使得内存使用量显著增加,因为内存中不仅保存当前进程的数据,还保存了fork时刻的内存数据。
Redis进行快照的过程中不会修改RDB文件,只有快照结束后才会将旧的文件替换成新的,也就是说任何时候RDB文件都是完整的,这对于数据库备份有一个很好的作用。
二、AOF方式
通过RDB方式实现持久化,一旦Redis异常退出,,就会丢失最后一次快照之后更改的所有数据。为了降低因进程中止导致的数据丢失风险,可以使用AOF方式实现数据持久化。
默认情况下,Redis是没有开启AOF方式的持久化,可以通过appendonly参数启动:appendonly yes
开启AOF持久化后,每执行一条会更改Redis中数据的命令,Redis就会将该命令写入硬盘中的AOF格式的文件,即.aof格式文件存储的是一些redis指令。这个时候就要注意,当频繁操作Redis中的数据时,AOF格式文件所占内存就会越来越大,而且会有很多没用的指令,如连续执行set foo 1,set foo 2,set foo 3,那么前两条指令是没有意义的,Redis很强大,它会自动将没有意义的指令删除,即每当达到一定条件时,Redis就会自动重写AOF文件,而这个条件可以在配置文件中设置。重写的过程只和内存数据有关,和之前的AOF文件无关,这点跟RDB相似。
在同步硬盘数据数据时,由于操作系统的缓存机制,数据并没有真正地写入到硬盘中,而是进入到系统的硬盘缓存。在默认的情况下,系统每个30秒会执行一次同步操作,在这30秒的过程中,如果系统异常退出,那么会导致硬盘内存中的数据丢失。Redis允许同时开启RDB和AOF方式,既保证了数据安全,又使得备份操作十分容易。AOF可以有效降低数据丢失的可能性,RDB可以使得数据备份容易达到。