【问题标题】:Is there some difference between parsing network and parsing a file?解析网络和解析文件之间有什么区别吗?
【发布时间】:2012-04-26 11:07:16
【问题描述】:

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

谢谢!

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

【问题讨论】:

  • 在这两种情况下都是一个 IO 流。应该没什么区别。我会修改你的网络代码。
  • 您不能在网络流中搜索。
  • 显而易见的问题是你如何解析?
  • @Jon:确实如此,但是在从流中读取 .rdb 时您不应该寻找。这是相当连续的。
  • @SergioTulentsev:不知道 .rdb,所以我相信它可以按顺序解析。但这并不意味着没有人编写代码来解析它“错误”。

标签: c networking network-programming redis protocols


【解决方案1】:

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

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

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

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

旁白:

我是redis-rdb-tools 的作者,这是一个基于python 的redis 转储文件解析器。我已经记录了format of the dump file,并有一个FAQ entry 来了解如何用不同的语言创建解析器。您可能会发现这些链接很有用。

【讨论】:

  • 感谢 rdb 文件格式说明!顺便说一句,当前格式版本是 6。:)
  • @SergioTulentsev - 确实如此,并且 redis-rdb-tools 从 antirez 更新它的那一天起就支持它!你能指出我不正确的文档以便我修复它吗?谢谢!
  • 这个,例如:github.com/sripathikrishnan/redis-rdb-tools/wiki/FAQs。 “我们有版本 2 到 5 的单元测试。”这有点暗示版本 6 未经测试。
  • 谢谢,常见问题已更新。我们也对第 6 版进行了测试,所以这是文档中的一个字符更改。
猜你喜欢
  • 1970-01-01
  • 2012-05-11
  • 2011-08-23
  • 2011-03-30
  • 2011-08-20
  • 2014-01-27
  • 2023-03-08
  • 1970-01-01
  • 2020-08-10
相关资源
最近更新 更多