2012-04-26 92 views
1

我在寫一個工具來轉儲redis的rdb數據文件。我發送一個'同步'命令作爲一個奴隸保存。然後解析rdb到鍵,值。 但是,當從網絡直接讀取時,我無法解析rdb。當我將網絡數據寫入文件並對文件進行削減時,它運行良好。我不知道爲什麼。代碼解析網絡和文件是完全相同的。 解析網絡和解析文件有一些區別嗎?解析網絡和解析文件有一些區別嗎?

謝謝!

----------------更新------------------
問題解決:
這是我的錯,我不熟悉網絡編程。我用錯誤的方式讀取系統調用。
例如:
我想讀的網絡規模字節,我寫道:
nread = read(fd,buf,SIZE)
我假定NREAD等於大小。這對大部分時間閱讀文件很有效,但在大部分時間讀取網絡流時不起作用。 因此,我使用redis replication.c中的syncRead來代替。
感謝大家幫我解決問題!

+0

這是兩種情況下的IO流。應該沒有區別。我會修改你的網絡代碼。 – 2012-04-26 11:09:33

+3

您無法在網絡流中搜索。 – Jon 2012-04-26 11:09:50

+0

明顯的問題是你如何解析? – 2012-04-26 11:10:56

回答

3

解析網絡流和解析文件沒有區別。特別是,在解析redis轉儲文件的情況下,永遠不需要向前或向後尋找。您事先知道需要讀取的確切字節數,以便分配適量的內存。

通過同步命令連接作爲從站的一個問題 - Redis服務器不關閉連接。一旦rdb文件被傳輸,它就會開始通過常規的redis協議發送增量命令。如果您無法檢測到此轉換,您將有解析錯誤。

如果你仍然無法解析網絡流,也許你應該提供一些代碼,或者粘貼一些異常/堆棧跟蹤。

話雖如此,我認爲最好將轉儲文件寫入磁盤,然後解析它。這就是redis奴隸現在的運作方式。

旁白:

我的redis-rdb-tools筆者,這是一個基於Python的解析器Redis的轉儲文件。我已經記錄了format of the dump file,並有一個FAQ entry關於如何創建一個不同語言的解析器。您可能會發現這些鏈接很有用。

+1

感謝您對rdb文件格式的描述!順便說一句,目前的格式版本是6. :) – 2012-11-05 11:38:03

+0

@SergioTulentsev - 確實是這樣,自從antirez更新它之後,redis-rdb-tools已經支持它了!你能否指出我的錯誤文件,以便我可以修復它?謝謝! – 2012-11-05 13:18:16

+1

這一個,例如:https://github.com/sripathikrishnan/redis-rdb-tools/wiki/FAQs。 「我們有版本2到5的單元測試。」這意味着版本6未經測試。 – 2012-11-05 13:23:22