1.RDB(Redis DataBase)
RDB 是什么?
在指定的时间间隔内将内存中的数据集快照写入磁盘, 也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里。
怎么实现的?
触发RDB时,Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。
保存的是dump.rdb文件
配置和触发
- 配置位置
Redis.conf文件中如图。
- 如何配置
save 900 1 表示在900秒内改变了1次则触发RDB
save 300 10 表示在300秒内改变了10次则触发RDB
save 60 10000 表示在60秒内改变了10000次则触发RDB
-
如何触发
-除了满足配置条件时触发外。也可以通过命令触发Save
:只管保存,其它不管,全部阻塞
BGSAVE
:Redis会在后台异步进行快照操作,快照同时还可以响应客户端请求。可以通过 lastsave命令获取最后一次成功执行快照的时间
flushall
:也会产生dump.rdb文件,但里面是空的,无意义
如何恢复和停止RDB
- 恢复
将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可 - 停止
动态所有停止RDB保存规则的方法:redis-cli config set save ""
全局配置则在redis.conf
文件中位置save ""
优势和劣势
-
优势
适合大规模的数据恢复对数据完整性和一致性要求不高 -
劣势
在一定间隔时间做一次备份,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改
Fork的时候,内存中的数据被克隆了一份,大致2倍的膨胀性需要考虑
2.AOF(Append Only File)
AOF是什么
以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作
启动和恢复
- 启动
如图,文件默认为appendonly.aof
- 恢复
redis
启动目录有appendonly.aof
文件则可自动恢复
当appendonly.aof
文件损坏时,可以使用Redis-check-aof --fix appendonly.aof
进行修复后重启
重写机制Rewrite
- 重写介绍
AOF采用文件追加方式,文件会越来越大为避免出现此种情况,新增了重写机制,当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集.可以使用命令
bgrewriteaof
- 重写原理
AOF文件持续增长而过大时,会fork出一条新进程来将文件重写(也是先写临时文件最后(rename),
遍历新进程的内存中数据,每条记录有一条的Set语句。重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,这点和快照有点类似
- 触发重写,可以在配置文件中配置触发条件
默认是Redis会记录上次重写时的AOF大小,默认配置是当AOF文件大小是上次rewrite后大小的一倍且文件大于64M时触发
触发设置
appendfsync always
:同步持久化 每次发生数据变更会被立即记录到磁盘 性能较差但数据完整性比较好
appendfsync everysec
:异步操作,每秒记录 如果一秒内宕机,有数据丢失
appendfsync no
:从不同步
优劣
相同数据集的数据而言aof文件要远大于rdb文件,恢复速度慢于rdb
Aof运行效率要慢于rdb,每秒同步策略效率较好,不同步效率和rdb相同
3.小结
-
RDB
RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储 -
AOF
AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些
命令来恢复原始的数据,AOF命令以redis协议追加保存每次写的操作到文件末尾.
Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大 -
同时开启RDB和AOF
在这种情况下,当redis重启的时候会优先载入AOF文件来恢复原始的数据,
因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整. -
那要不要只使用AOF呢?
建议不要,因为RDB更适合用于备份数据库(AOF在不断变化不好备份),
快速重启,而且可能有AOF可能潜在的bug,留着作为一个万一的手段。