-
什么是持久化
redis的持久化即将内存中的数据写入磁盘中,以保证数据存储的可靠性。redis的持久化方式有两种:RDB(Redis DataBase)和AOF(Append Only File).
-
RDB
1. RDB是什么
RDB机制是通过把某个时刻的所有数据生成一个快照来保存,然后在指定的时间间隔内将内存中的数据集快照写入磁盘,它恢复时是将快照文件直接读到内存里。RDB是redis默认使用的持久化方式。
2. RDB如何进行持久化
有三种方式:
1) save主动触发
可以使用save命令主动触发持久化。
该命令会阻塞当前Redis服务器,执行save命令期间,Redis不能处理其他命令,直到RDB过程完成为止。执行完成时候如果存在老的RDB文件,就把新的替代掉旧的。
2)bgsave触发
执行该命令时,Redis会在后台异步进行快照操作,快照同时还可以响应客户端请求。具体操作是Redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束。阻塞只发生在fork阶段,一般时间很短。基本上 Redis 内部所有的RDB操作都是采用 bgsave 命令。
3)自动触发
自动触发机制是通过配置文件的配置项指定的,指定后将会自动触发bgsave。配置项:
save <seconds> <changes> // 内存中数据使用RDB策略持久化到磁盘的频率,此配置表示x秒内变更y次key则触发一次持久化
save和bgsave对比:
| save | bgsave |
IO类型 | 同步 | 异步 |
阻塞 | 是 | 否 |
复杂度 | O(n) | O(n) |
优点 | 不额外消耗内存 | 不阻塞客户端命令 |
缺点 | 阻塞客户端命令 | 需要fork,消耗内存 |
注意:执行flushall命令会立即产生dump.rdb文件,但里面是空的
3. RDB保存的是dump.rdb文件
4. 如何恢复
将备份文件(dump.rdb)移动到redis安装目录(配置文件中配置的dir目录)并启动服务即可。
5. RDB优点
1)适合大规模的数据恢复
2)对数据完整性和一致性要求不高
3)RDB文件紧凑,全量备份,非常适合用于进行备份和灾难恢复。
4)RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快
6. RDB缺点
1)在一定间隔时间做一次备份,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改
2)fork进程的时候,内存中的数据被克隆了一份,会消耗额外内存
-
AOF
1. 什么是AOF
以日志的形式来记录每个写操作,将redis执行过的所有写指令记录下来,只允许追加文件但不可以改写文件,redis启动时会读取该文件重新构建数据,换言之,redis重启的话就跟进日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。
2. AOF保存的是appendonly.aof文件
3. AOF数据恢复
在redis启动时会自动读取配置文件中配置的appendfilename进行数据恢复。
若aof文件被损坏,则可以使用redis-check-aof --fix进行修复
4. rewrite
是什么:重写机制是为了应对AOF文件越来越大的问题,当AOF文件的大小超过设定的阈值时,redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集,可以使用命令hgrewriteaof。
重写原理:AOF文件持续增长而过大时,会fork出一条新进程来将文件重写(先写临时文件后再rename),遍历新进程中的数据,可恢复数据的最小指令集写入新AOF文件,这个过程并没有读取旧的AOF文件。
触发机制:redis会记录上次重写时的AOF大小,默认配置是当AOF文件大小是上次rewrite后大小的一倍且文件大于64M时进行重写。
5. AOF优势
1)数据完整性和一致性很高,同步频率可控(每秒、数据变动时、不同步)
2) 日志文件的写入操作采用的是append模式,因此在写入过程中即使出现宕机现象,也不会破坏日志文件中已经存在的内容
6. AOF劣势
1)针对相同数据集的数据而言,aof文件要远大于rdb文件,恢复速度慢于rdb
2) aof运行效率要慢于rdb,每秒同步策略效率较好,不同步效率和rdb相同
-
RDB or AOF
如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加高效,RDB的缺点是最后一次持久化后的数据可能丢失。
如果对数据的一致性和完整性要求较高,则可以选用AOF;
AOF和RDB可以同时存在,同时存在时,redis启动服务时会先从aof备份,再从rdb备份