redis之AOF文件加载过程( 二 )

由于AOF文件中保存的都是用户可见的一条条命令,因此loadAppendOnlyFile通过创建一个伪客户端读取AOF文件获取一条条命令来恢复执行 。
 
redis读取AOF文件并还原数据库的状态过程如下:

redis之AOF文件加载过程

文章插图
 
以上就是服务器根据读入AOF文件进行还原数据库状态的原理 。
 
从上面的介绍可以知道加载AOF文件是redis启动过程中的步骤,当业务线程启动连接redis获取或者保存数据时,若redis正在加载数据,则有可能获取不到数据:
127.0.0.1:6379> get a(error) LOADING Redis is loading the dataset in memory原因是当加载过程中,有些客户端发来的命令是不执行的,直接返回上述结果 。只有命令带有"l"(小写的L)标志的才会执行,比如info命令等 。
 
【redis之AOF文件加载过程】那么怎么判断AOF文件是否加载完成呢?
刚才说到加载时可以执行info命令,redis info 命令以一种易于理解和阅读的格式,返回关于 Redis 服务器的各种信息和统计数值 。该统计信息中有Persistence 参数,该参数中记录着 RDB 和 AOF 的相关信息,其中有个loading字段标志这数据是否正在加载,当正在加载时为1,加载完为0,因此可以根据该字段来判断数据是否加载完毕 。
127.0.0.1:6379> info Persistence# Persistenceloading:1// 1表示正在加载数据...127.0.0.1:6379> info Persistence# Persistenceloading:0// 0表示数据加载完毕... 
因此业务线程可以根据info命令获取loading进行判断数据是否加载完毕 。
public boolean isLoading(){try{String info = (String)redisTemplate.getRequiredConnectionFactory().getConnection().info("Persistence").get("loading");if("0".equalsIgnoreCase(info)){return true;}}catch (Exception e){error("Failed to get loading status : {}", e.getMessage());}return false;} 




推荐阅读