文章目录
Redis持久化中的AOF(Append Only File)持久化
开启aof持久化
从上图中可以看出aof持久化是追加模式,也就是如果使用的是aof持久化,那么在redis写的所有的命令都会被追加到appendonly.aof持久化文件中;aof持久化方式不像rdb持久化,因为rdb持久化不会在dump.rdb文件中追加内容,它是先对redis此时16个数据库的状态进行一次快照操作,然后生成一个持久化文件dump.rdb,然后用后面生成的这个dump.rdb文件直接替换掉上一个dump.rdb文件;
注意:aof持久化文件appendonly.aof中存储的都是redis数据库中已经执行过得命令,但是rdb持久化文件dump.rdb中存储的是redis数据库中的内容。
默认是不开启的,需要手动进行配置。我们只需要将appendonly改为yes就开启了aof,如下图:
aof持久化的时候appendonly.aof持久化文件是什么时候生成的?
如果用的是aof持久化,那么redis数据库中所有的新的写的信息都会追加到appendonly.aof文件当中,如下图:
但是这个appendonly.aof文件是在什么时候生成的呢?请看下图:
也就是说在只要你用的是aof持久化方式,那么在启动redis服务器的时候,就会自动生成appendonly.aof持久化文件。
appendonly.aof文件中的数据是什么时候怎样恢复到redis数据库中的?
在redis服务器启动的时候,appendonly.aof文件中的数据会恢复到redis数据库中,但是要注意的一点是redis配置文件中的appendonly的值必须要设置成yes,表示的是redis会使用aof持久化,reids默认情况下使用的是rdb持久化,在redis服务启动的时候会使用dump.rdb持久化文件恢复数据,所以如果想要使用aof持久化,通过appendonly.aof文件恢复redis数据库里面的数据,那么redis配置文件中的appendonly的值一定要设置成是yes,如下图:
怎样把appendonly.aof持久化文件里面的数据恢复到redis数据库中?
其实aof持久化恢复appendonly.aof文件中的数据与rdb持久化恢复dump.rdb里面的数据过程都类似,就是先开启redis配置文件中对aof持久化的支持,即把appendonly的值设置成是yes,然后把appendonly.aof这个文件放到redis-cli的同级目录下,然后断开连接,重启redis服务,重新连接redis客户端,这样就可以把appendonly.aof文件中的内容给恢复了,如下图:
使用redis-check-aof工具校验appendonly.aof持久化文件中的内容
appendonly.aof文件中记录了我们所有的写操作,如果appendonly.aof文件中有错误,那么这个时候redis是启动不起来的。我们需要修复这个aof文件,redis给我们提供了这样一个工具,redis-check-aof,对应的命令是redis-check-aof --fix appendonly.aof,假设appendonly.aof持久化文件中有一些不规范的内容,所谓的不规范也就是不属于redis数据库的命令,因为持久化文件appendonly.aof中存放的全是命令,可以通过redis-check-aof这个校验工具去删除持久化文件appendonly.aof中的不规范的数据,如下图:
假设不对上面的appendonly.aof文件更改,那么当连接redis服务器的时候就会出错,如下图:
然后可以使用redis-check-aof去校验appendonly.aof文件,如下图:
appendonly.aof文件校验成功之后,可以再次查看appendonly.aof文件中的内容,和没校验之前做一次比较,如下图:
最后重启一下redis服务,看看此时redis客户端能不能连接成功,如下图:
aof持久化的时候缓存中的内容同步到硬盘的三种方式
在使用aof持久化的时候,在redis数据库中写的命令并不是立刻被同步到持久化文件appendonly.aof中的,而是先把命令保存到缓存中,然后再把缓存中的数据同步到持久化文件appendonly.aof中的,这里面牵涉到了三种把缓存中的数据同步到持久化文件appendonly.aof中的机制,如下图:
默认使用的方式是appendfsync everysec;
在什么情况下redis数据库中写的命令可以追加到appendonly.aof文件中?
我在验证在redis数据库中写的命令都可以追加到appendonly.aof文件中时出现了一个问题,就是我在redis中执行的写的命令,在一些情况下可以保存到appendonly.aof文件中,而在另一些情况下不能够保存到appendonly.aof文件中,这是为什么呢?
这是因为只有当第一次重新连接redis-cli客户端的时候,在redis中写的所有的命令才能够追加到原来的appendonly.aof文件中,如果此时从redis-cli客户端退出,但是却不关闭redis-cli客户端然后重新打开redis-server服务,那么当你再次连接redis客户端的时候,你在redis数据库中的操作命令是不能够被追加到appendonly.aof文件中的,这两种情况一种是在redis数据库中写的命令可以追加到appendonly.aof持久化文件中,另外一种是在redis数据库中写的命令不能追加到appendonly.aof持久化文件中,先来看一下在redis数据库中写的命令能够追加到appendonly.aof持久化文件中的情况,如下图:
再来看一下在redis数据库中写的命令不能追加到appendonly.aof持久化文件中的情况,如下图:
aof持久化的优点和缺点
优点:每一次修改都同步,文件的完整性会更加好。
缺点:如果每秒同步一次,可能会丢失一秒的数据。aof的运行效率比rdb要慢,所以我们redis默认的配置是rdb持久化。