Redis持久化(RDB和AOF)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sdr_zd/article/details/80787016

前言

为了使Redis在重启后仍能保证数据不丢失,需要将数据从内存中以某种形式持久化到硬盘中。Redis提供了两种持久化的方式:RDB和AOF,这两种持久化方式所产生的存储文件的格式分别是.rdb和.aof。

一.RDB

1.什么是RDB方式?

RDB就是快照方式实现持久化,所谓快照就是将当前的信息全部存储到一个位于安装目录下的dump.rdb文件中,redis默认是开启RDB方式的。

2.有两种方式执行快照:

1) 自动执行:第一种是当满足一定条件时,会进行一次快照,这是一种固定时间间隔会产生的快照。
在redis.conf文件中有:

save <seconds> <changes>

这里写图片描述
在多少秒之内发生几条及以上的记录进行更新就进行一次快照,比如第一条就是在900秒内出现至少一条记录被更新就进行一次快照;
当执行SHUTDOWN命令关闭连接时,会进行一次快照保证数据持久化。
“如果持久化被打开的话, SHUTDOWN 命令会保证服务器正常关闭而不丢失任何数据。”(来自Redis命令参考
2) 手动执行:如果没有触发自动快照,需要对Redis执行手动快照操作,SAVE和BGSAVE都是执行手动快照,但是两者有区别:可以通过SAVE和BGSAVE命令来手动快照,两个命令的区别是前者是由主进程进行快照,会阻塞其他请求,后者是通过fork子进程进行快照。
3) 注意:由于Redis使用fork来复制一份当前进程,那么子进程就会占有和主进程一样的内存资源,比如说主进程8G内存,那么在备份的时候,必须保证有16G的内存,要不然会启用虚拟内存,性能非常的差。

3.RDB的缺点:

1) save命令会发生阻塞,即使是使用bgsave也会创建一个子进程而耗费大量资源,有些情况下,fork子进程的时间甚至会超过数据备份的时间;
2) 定期的持久化可能会存在数据丢失的风险,可以根据情况配置save的参数。

二.AOF

1.什么是AOF方式?

RDB方式是将数据进行持久化,而AOF是将执行的语句进行持久化,将执行的写操作的语句都存储到appendonly.aof文件中,通过执行存储的语句的方式恢复数据。AOF方式默认是关闭的,可以在redis.conf文件中更改配置(把no改为yes)。
这里写图片描述
这里写图片描述
appenfsync是进行同步的频率:
always是每执行一条写操作语句就进行一次同步;
everysec是每秒执行一次同步;
no是不开启同步。
这三者中,always会大大降低性能,所以一般选用everysec方式,即使出现数据丢失,最坏的情况下也只是丢失一秒的数据。

2. .aof文件过大怎么办?

随着写操作的执行增加,.aof文件会越来越大,redis提供了一个rewrite操作对文件进行压缩。
这个压缩并不是从原来的备份文件中复制语句而是将数据存下来,将其转化为最简单的SET语句(这里就比较像是快照了),同时还在对正在进行的写操作进行备份,对两个文件进行合并成为一个文件,创建的新文件在进行压缩合并之后才会更名为append.aof。
那么什么时候去执行这条语句呢?
1) 手动执行
执行bgrewriteaof命令
2) 自动执行
这里写图片描述
这两条配置指定了进行rewrite的条件,
auto-aof-rewrite-percentage 100:当前.aof文件的大小一旦超过上一次重写后的.aof文件大小的百分之多少(此处是100)就进行一次rewrite;
auto-aof-rewrite-min-size 64mb:当.aof文件大小超过多大(此处是64mb)才可以进行rewrite操作。

三.总结

AOF:数据更完整,但恢复数据速度较慢(需要执行写入操作)
RDB:数据不能保证很完整,但恢复数据较快
根据这两种方式的优缺点,若要实现持久化,可以通过配置文件来指定它们中的一种,或者同时使用它们(不建议同时使用),在主从架构中,master通常使用AOF,slave使用RDB,主要原因是master需要首先确保数据完整性,它作为数据备份的第一选择;而slave功能就是响应用户的读请求,对响应速度要求高,当master数据恢复后可以通过主从复制保证数据的一致性。

猜你喜欢

转载自blog.csdn.net/sdr_zd/article/details/80787016