阿里云数据库ApsaraDB 关注
手机版

Redis协议简介及持久化Aof文件解析

  1. 云栖社区>
  2. 阿里云数据库ApsaraDB>
  3. 博客>
  4. 正文

Redis协议简介及持久化Aof文件解析

白宸 2016-11-17 09:48:24 浏览3810 评论2

摘要: 本文主要对Redis的协议进行简单介绍并提供了一种方法用于解析AOF文件

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']

用云栖社区APP,舒服~

【云栖快讯】云栖社区技术交流群汇总,阿里巴巴技术专家及云栖社区专家等你加入互动,老铁,了解一下?  详情请点击

网友评论

1F
ninozhang

对于从来没有接触过 py 的人来说,这个文档也太草率了吧?
1、AOF 那里,根本没有说怎么调用,以及参数如何传入
2、依赖了 hiredis,我怎么知道怎么安装这个依赖?

白宸

后续补充下,您这边后续关注下更新即可

评论
2F
我的路

赞~

白宸
文章16篇 | 关注66
关注
一种稳定可靠、性能卓越、可弹性伸缩的数据库服务。基于飞天分布式系统和全SSD盘高性能存储,支... 查看详情
为企业和开发者提供稳定、安全、智能的把网站域名或应用资源转换为计算机用于互连的数字 IP地址... 查看详情
面向阿里云ECS实例、HPC和Docker的文件存储服务。 查看详情
为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效... 查看详情
建站4折

建站4折