转载本文请联系Java极客技术公众号。坚持首先,让我们谈谈什么是坚持。持久化是一种在持久状态和瞬态之间转换程序数据的机制。通俗地说,就是将瞬态数据(比如内存中的数据,不能永久保存)持久化到持久化数据(比如持久化到数据库,可以长期保存)。另外,我们用的Redis之所以快,是因为数据是存放在内存中的。为了保证服务器异常后数据能够恢复,就有了Redis的持久化。RDB和AOF之前说什么是持久化,现在说说Redis的持久化,我们都知道Redis的持久化有两种方式,一种是快照形式的RDB,另一种是增量文件AOF。RDBRDB持久化方式是在特定的时间间隔保存某个时间点的数据快照。我们拿到这个数据快照之后,就可以根据这个快照来完整的复制数据了。我们可以通过这种方式来备份数据,备份快照文件,然后传输到其他服务器上,直接恢复数据。但这只是某个时间点的所有数据。如果我们想要最新的数据,只能周期性的生成快照文件。RDB的实现主要是通过创建子进程实现RDB文件的快照生成,通过子进程实现备份功能,不会影响主进程的性能。同时,上面也提到了RDB快照文件是按照一定的时间间隔保存数据的,如果时间间隔过长会导致该时间间隔内的数据全部丢失,在快照之前服务器发生故障生成;同学们会说我们可以把时间间隔设置的短一些,适当的缩短是可以的,但是如果间隔设置的短一些,频繁的快照生成还是会对系统有影响的,尤其是在在数据量很大的情况下,这种情况在高性能环境中是不允许的。我们可以在redis.conf中配置RDB,配置生成快照的策略,以及日志文件的路径和名称。还有定期的备份规则,如下图,注释里面写的很清楚。简单的说就是在一定时间内,有多少key发生变化,就会触发快照。例如save30010表示5分钟内有10个key发生变化,就会触发生产快照,其他同理。Redis除了在配置文件中配置了自动生成快照文件外,Redis本身也提供了相关的命令让我们可以手动生成快照文件,即SAVE和BGSAVE。这两个命令功能相同,但方法和效果不同。SAVE命令执行后阻塞服务器进程。阻塞后,服务器无法处理任何请求,因此无法用于生产。与直接阻塞服务器进程的SAVE命令不同,BGSAVE命令会生成一个子进程,并通过子进程创建一个RDB文件。主进程仍然可以处理接收到的命令,这样服务器就不会被阻塞,可以用于生产。阿芬是来测试自动生成快照的。我们修改快照生成策略为save102,然后在本地启动Redis服务,使用redis-cli链接进入。步骤如下:1.修改配置,如下:2.启动Redis从启动日志我们可以看到,服务默认会先读取RDB文件进行恢复。3、链接Redis服务,10s内设置3个key。4、此时我们会在Redis日志中看到如下内容。因为触发了规则,所以启动子进程进行数据备份。同时,在对应的文件路径下,我们也看到了rdb文件。从上面可以看出我们配置的规则已经生效,RDB文件也已经成功生成。如果服务器出现异常,只要重启,就会读取对应的RDB文件进行数据备份。AOFAOF是附加执行命令的一种形式。它和RDB的区别在于AOF不保存数据,而是保存执行动作。启用AOF功能后,客户端连接后执行的每条命令都会被记录下来。这其实让阿凡想起了MySQL的binlog日志,也是一个记录操作的命令,后面可以根据文件恢复数据。AOF是append命令格式的文件。同样,我们可以定义同步数据的频率。Redis本身提供了三种策略来实现命令同步,分别是不同步、每秒同步一次、当有查询的时候同步一次。默认策略也是使用最多的策略是每秒同步一次,所以我们可以知道丢失的数据最多只有一秒的数据。有了这个机制,AOF会比RDB可靠很多,但是因为文件里有执行的命令,所以AOF文件一般比RDB文件大。Redis的AOF功能默认是不开启的。我们可以通过在配置文件中配置appendonlyyes开启该功能,同时配置同步策略appendfsynceverysec开启每秒同步一次。我们拿到AOF文件后,就可以根据这个文件数据进行恢复。同样,我们在redis.conf中可以看到,AOF功能默认是没有开启的,我们也可以指定相应的文件名和路径。接下来我们测试开启AOF功能,先修改配置再重启Redis服务器,我们会发现RDB文件的日志还没有被读取,在日志文件路径下生成了一个aof文件。需要注意的是,因为我们重启了服务,开启了AOF,之前添加的数据现在Redis服务器中已经不存在了(什么问题?)。接下来我们使用客户端连接进入,设置如下值,然后我们就可以查看aof文件的内容了。我们可以看到aof文件中的内容是执行的命令,但是是以固定的格式存储的。如果我们在备份过程中不需要任何数据,我们可以手动删除相应的命令来重新备份数据。文件加载顺序我们在上面提到了Redis的两种持久化方案,两种方案都会生成对应的文件,那么Redis在恢复数据时是如何加载文件的呢?当两个文件都存在时,下一步,哪个会占上风?通过上面的测试,我们其实可以看出Redis是以AOF为优先级的。毕竟和RDB相比,AOF在异常情况下保存的数据更加完整。
