Redis提供了两种不同的持久化模式:
- RDB 快照模式,该模式用于生成某个时间点的备份信息,并且会对当前的key value进行编码存储到rdb文件中
- AOF 持久化模式,该模式类似binlog的形式,会记录服务器所有的写请求,在服务重启的时候通过回放执行命令请求来恢复原有的数据
AOF文件记录的是原始的Redis写请求命令,所以在了解AOF文件之前我们需要了解下Redis协议。
Redis协议介绍
Redis客户端和服务端之间可以通过RESP (REdis Serialization Protocol)来进行通信,作者在设计这个协议主要依据了以下三点:
- 易实现
- 解析速度快
- 容易被人类理解
RESP协议主要由以下几种数据类型组成:简单字符串、错误信息、整数、字符串、数组。客户端发送给服务端的是一个数组命令,服务端根据不同命令的实现进行回复。每个数据类型的定义如下:
- 简单字符串: 以+号开头结尾为rn,比如+OKrn
- 错误信息: 以-号开头结尾为rn的字符串,比如-ERR Readonlyrn
- 整数: 以:开头结尾为rn,开头和结尾之间为整数,比如:1rn
- 字符串: 以$开头随后为该字符串长度和rn,接下去为真正的字符串内容和rn
- 数组: 以开头的,随后指定了数组元素个数并通过rn划分,每个数组元素都可以为上面的四种,比如1rn$4rnpingrn
对于Redis的请求客户端以RESP协议的形式发送过来,Redis后端执行完命令之后如果打开了aof文件记录Redis会讲该请求记录到AOF文件中。
AOF文件解析
在日常开发测试中,有时候为了方便查看历史的命令记录我们需要对AOF文件进行解析,这样可以方便我们查看对某个Key的记录。这里我们通过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']