在日常开发测试中,为了方便查看历史命令和查看某个Key的记录,需要对AOF文件进行解析。
Redis持久化模式
- RDB快照模式:该模式用于生成某个时间点的备份信息,并且会对当前的Key value进行编码,然后存储在rdb文件中。
- AOF持久化模式:该模式类似binlog的形式,会记录服务器所有的写请求,在服务重启时用于恢复原有的数据。
AOF持久化模式的详细说明
Redis客户端和服务端之间通过RESP(Redis Serialization Protocol)进行通信。RESP协议主要由以下几种数据类型组成,每种数据类型的定义如下:
- 简单字符串:
以+号开头,结尾为rn,例如:+OKrn。
- 错误信息:
以-号开头,结尾为rn的字符串,例如:-ERR Readonlyrn。
- 整数:
以冒号开头,结尾为rn,开头和结尾之间为整数,例如(:1rn)。
- 大字符串:
以$开头,随后为该字符串长度和rn,长度限制512M,最后为字符串内容和rn,例如:$0rnrn。
- 数组:
以*开头,随后指定数组元素个数并通过rn划分,每个数组元素都可以为上面的四种,例如:*1rn$4rnpingrn。
Redis客户端发送给服务端的是一个数组命令,服务端根据不同命令的实现方式进行回复,并记录到AOF文件中。
AOF文件解析
这里通过Python代码调用hiredis库来进行Redis AOF文件的解析,代码如下:
#!/usr/bin/env python """ A Redis appendonly file parser """ import logging import hiredis import sys if len(sys.argv) != 2: print sys.argv[0], 'AOF_file' sys.exit() file = open(sys.argv[1]) line = file.readline() cur_request = line while line: req_reader = hiredis.Reader() req_reader.setmaxbuf(0) req_reader.feed(cur_request) command = req_reader.gets() try: if command is not False: print command cur_request = '' except hiredis.ProtocolError: print 'protocol error' line = file.readline() cur_request += line file.close
使用以上脚本解析一个AOF文件的结果如下。得到如下结果后方便您随时查看某个Key相关的操作。
['PEXPIREAT', 'RedisTestLog', '1479541381558'] ['SET', 'RedisTestLog', '39124268'] ['PEXPIREAT', 'RedisTestLog', '1479973381559'] ['HSET', 'RedisTestLogHash', 'RedisHashField', '16'] ['PEXPIREAT', 'RedisTestLogHash', '1479973381561'] ['SET', 'RedisTestLogString', '79146']