1

我正在编写一个工具来转储 redis 的 rdb 数据文件。我发送一个“同步”命令保存为从属。然后将 rdb 解析为键、值。但是,当直接从网络读取时,我无法解析 rdb。当我将网络数据写入文件并解析文件时,它运行良好。我不知道为什么。代码解析网络,文件完全相同。解析网络和解析文件之间有什么区别吗?

谢谢 !

--update--------------------------------
问题解决:
是我的错,我不熟悉网络编程。我以错误的方式使用了读取系统调用。
例如:
我想从网络读取 SIZE 字节,我写道:
nread = read(fd,buf,SIZE)
我假设 nread 等于 SIZE 。这适用于大多数时间读取文件,但在大多数时间读取网络流时不起作用。所以我在 redis replication.c 中使用了syncRead。
谢谢大家帮我解决问题!

4

1 回答 1

3

解析网络流和解析文件没有区别。具体来说,在解析redis转储文件的情况下,永远不需要向前或向后搜索。您事先知道必须读取的确切字节数,因此您可以分配适量的内存。

通过同步命令作为从服务器连接的一个问题 - Redis 服务器不会关闭连接。一旦 rdb 文件被传输,它就开始通过常规的 redis 协议发送增量命令。如果您无法检测到此转换,则会出现解析错误。

如果您仍然无法解析网络流,也许您应该提供一些代码,或者粘贴一些异常/堆栈跟踪。

话虽如此,我认为最好将转储文件写入磁盘,然后进行解析。这就是redis slave现在的运作方式。

在旁边 :

我是redis-rdb-tools的作者,它是一个基于 python 的 redis 转储文件解析器。我已经记录了转储文件的格式,并且有一个关于如何以不同语言创建解析器的常见问题解答条目。您可能会发现这些链接很有用。

于 2012-04-26T11:58:21.890 回答