Redis持久化方式介绍、设置及对比

今天来看一下redis持久化的几种方式。

RDB快照

RDB快照方式是redis默认的持久化方式,这种持久化方式是将内存数据按照一定规则方式存储在“dump.rdb”二进制文件中。当redis重启时会加载“dump.rdb”二进制文件中数据到内存。

持久化规则:

1.通过配置规则自动持久化

如果需要RDB方式持久化数据,就需要在redis.conf配置文件中修改以下图中配置:

Redis持久化方式介绍、设置及对比

如上图中用红框标注的两处配置,我们具体来看一下这两个默认配置是干什么的:

save 900 1       : 若900s内有一次修改(不包括get命令)命令,则保存快找;
       save 300 10      : 若300s内有10次修改命令,则保存快照;
       save 60 10000  :若60s内有10000次修改命令,则保存快找;

当然上面这些是redis默认配置,可以根据自己业务需求进行修改。

第二个配置是 dbfilename dump.rdb,用我初中的字母12j英语水平来看一下它的注释#The filename where to dump the DB  这个就是db文件储存的地方,那么此处的配置是redis默认配置,他放置 dump.rdb文件的位置是和redis.conf同一级目录下,那么我们来看一下他是不是在这里。

Redis持久化方式介绍、设置及对比

果然是在这里,哈哈哈!

2.通过命令持久化手动持久化

如果想手动执行命令生成快照,可以使用save或者bgsave两个命令,执行这两个命令之后redis会将数据生成一个新的快照并覆盖原来的快找,但是这两种是有区别的下面我们来看一下这两个命令的优缺点

sava:这种命令和其他的set,get一样,属于redis同步命令。我们知道redis是单线程执行命令的,所以如果redis运行中执行sava这条命令的时候,其他的命令如果进来只能阻塞,直至快照保存完。

bgsave:这个命令是一个异步命令,bgsave会从redis主进程中fork一个子进程专门来保存快找,由于它是一个异步命令,所以不会阻塞redis其他的同步命令,但是需要子进程也就意味着bgsave会消耗cpu内存。

 

优缺点

优点:RDB这种持久化方式根据自己业务需求来灵活设置快找保存规则,而且dump.rdb文件是里面是压缩的二进制文件,占用内存小,启动时加载快

缺点:正式由于设置的自动保存规则,有可能会导致持久化数据丢失。

 

AOF(append-only file)

正是由于RDB快照会导致redis数据丢失,所以redis在1.1版本开始推出了一种持久化方式:AOF。AOF这种方式可以强大到你每条set的命令都会被持久化。

如何启动AOF?及怎样使用?

我们还是老样子,来看一下redis.conf 这个配置文件。如下图:

Redis持久化方式介绍、设置及对比

 

我们来看一下这几个配置

appendonly no:这个表示是否开启aof持久化方式,默认是关闭的,我把它改成yes

appendfilename "appendonly.aof":这个好理解了,就是appendonly.aof这个持久化文件保存的位置

下面这三个是AOF同步的三种方式:

 appendfsync always:每次修改命令就执行一次同步,慢,但是安全。

appendfsync everysec:每秒钟修改命令就执行一次同步,快,最多丢失一秒钟数据。

 appendfsync no:从来不同步,快,不安全。

这三种同步方式各有各的好处,但是建议使用appendfsync everysec

 

AOF重写

虽然AOF这种方式比较快,也比较安全。但是appendonly.aof这种文件的格式是Resp格式,如下图:

Redis持久化方式介绍、设置及对比

appendonly.aof 这种文件格式,会把每条命令都记下来,在redis重启恢复数据的时候,就会将文件中的每条命令都执行一遍,这样是很耗费时间的。不过redis对这种做了优化,那就是重写。他会将key一些中间命令重写掉,直接保留最终值。

那么如何配置重写呢,我们来看一下redis.conf配置:

Redis持久化方式介绍、设置及对比

auto-aof-rewrite-min-size 64mb //aof文件至少要达到64M才会自动重写
auto-aof-rewrite-percentage 100 //aof文件自上一次重写后文件大小增长了100%则再次复发重写
上面两个是自动重写,其实我们可以通过bgrewriteaof 这个命令来手动fork子进程进行重写。
 

混合持久化

如上面两种持久化方式,RDB方式,数据恢复速度快,持久化文件小,但是容易丢失数据;AOF方式数据相对安全(根据策略决定),但是持久化文件大,恢复速度慢。为了解决这个问题,Redis4.0推出了一种新的持久化方式---混合持久化;

怎么配置混合持久化呢?

看一下redis.conf配置文件

Redis持久化方式介绍、设置及对比

 

aof-use-rdb-preamble yes:redis默认是开启混合持久化的。

混合持久化原理是什么?

混合持久化的数据还是储存在appendonly.aof个文件中,那么他是怎么储存的呢,直接上图。

Redis持久化方式介绍、设置及对比

如果开启了混合持久化,那么redis存储数据仍然是在appendonly.aof文件中,但是不同的是,appendonly.aof文件不单单只存储RESP格式数据,而是以重写为分割点,重写前的数据会存储为RDB格式,新来的修改命令仍然为Resp格式。

所以,混合持久化这种方式既压缩了文件存储空间,加快了redis启动速率,也保证了数据的安全性。所以建议使用这种持久化方式。