Redis协议简介及持久化Aof文件解析
Redis提供了两种不同的持久化模式:
RDB 快照模式,该模式用于生成某个时间点的备份信息,并且会对当前的key value进行编码存储到rdb文件中
AOF 持久化模式,该模式类似binlog的形式,会记录服务器所有的写请求,在服务重启的时候通过回放执行命令请求来恢复原有的数据
AOF文件记录的是原始的Redis写请求命令,所以在了解AOF文件之前我们需要了解下Redis协议。
Redis协议介绍
Redis客户端和服务端之间可以通过RESP (REdis Serialization Protocol)来进行通信,作者在设计这个协议主要依据了以下三点:
易实现
解析速度快
容易被人类理解
RESP协议主要由以下几种数据类型组成:简单字符串、错误信息、整数、字符串、数组。客户端发送给服务端的是一个数组命令,服务端根据不同命令的实现进行回复。每个数据类型的定义如下:
简单字符串: 以+号开头结尾为,比如+OK
错误信息: 以-号开头结尾为的字符串,比如-ERR Readonly
整数: 以:开头结尾为,开头和结尾之间为整数,比如:1
字符串: 以$开头随后为该字符串长度和,接下去为真正的字符串内容和
数组: 以*开头的,随后指定了数组元素个数并通过划分,每个数组元素都可以为上面的四种,比如*1$4ping
对于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 sysif len(sys.argv) != 2: print sys.argv[0], 'aof_file'
sys.exit()file = open(sys.argv[1])line = file.readline()
cur_request = linewhile 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 += linefile.close
结束
使用以上脚本解析一个aof文件结果如下,得到如下结果之后用户就可以很方便的查看一个Key相关的操作了。
['PEXPIREAT', 'RedisTestLog', '1479541381558']
['SET', 'RedisTestLog', '39124268']
['PEXPIREAT', 'RedisTestLog', '1479973381559']
['HSET', 'RedisTestLogHash', 'RedisHashField', '16']
['PEXPIREAT', 'RedisTestLogHash', '1479973381561']
['SET', 'RedisTestLogString', '79146']
沟通和互动以及更多干货,欢迎关注新浪微博:@阿里云云栖社区