由于AOF文件中保存的都是用户可见的一条条命令,因此loadAppendOnlyFile通过创建一个伪客户端读取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;}
推荐阅读
- 林平之到底爱不爱岳灵珊? 林平之爱岳灵珊吗
- 西游记大圣归来—《西游记之大圣归来》电影精彩片段
- 神话之那滔天的洪水究竟来自何方 洪水滔天
- 什么是“一阴一阳”之道 一阴一阳
- 乳腺癌吃什么水果好
- 血糖高的孕妇每天食谱
- 新媒体环境下如何坚守新闻之善 新媒体环境
- 陈飞宇|陈凯歌、陈红之子陈飞宇,与女网红亲密照曝光,清纯形象一朝丧尽
- 八仙之一的铁拐李的葫芦到底是做什么用的? 铁拐李的葫芦
- 少林七十二绝技秘传,之(内劲一指禅 少林内劲一指禅)