2013-01-21 38 views
2

最初我問過查詢.rdb文件,這不是我想要做的 - 我將查詢活動服務器。如何使用日期範圍從Redis(pub/sub)保存和檢索頻道數據?

我即將啓動一個項目,我們將使用RDB快照技術在發佈/訂閱方案中使用Redis。

.Net WCF客戶端將通過Marc Gravell'sBookSleeve配置Redis連接並接受傳入請求。

啓用RDB快照後,將創建增量快照。

我希望客戶能夠根據給定的頻道和日期範圍檢索數據集。我在想,我會使用相同的WCF客戶端進行讀寫操作(除非有明顯的異議)。我不完全清楚用什麼方法來查詢服務器來檢索日期範圍,通道特定的數據,並通過WCF客戶端傳遞。

是否可以通過BookSleeve實現此數據查詢功能(如果是這樣,如何)或者是否有其他更適合使用的訪問包裝器(例如ServiceStack.Redis)?

將BookSleeve用於寫入,將ServiceStack.Redis用作客戶端會更好嗎?

- 更新 -

我已經快照設置爲默認值:

save 900 1 
save 300 10 
save 60 

Redis Admin UI瀏覽數據,我希望是15分鐘(900秒)後,看到一些數據存儲在一個密鑰中,但是,搜索鍵顯示通道名稱(和其他鍵),但內部沒有值。

由於發佈/訂閱活動are not persisted,捕獲頻道數據並存儲它的好方法是什麼?

回答

1

編輯以解決OP的編輯:

如上所述:pub/sub不是持久的。我建議使用隊列; redis中的「列表」類型對此非常理想,其中lpush,rpush,lpop,rpop,rpoplpushltrim都是該場景的關鍵命令。您可以選擇使用pub/sub 以及來通知客戶端新數據的可用性 - 或者您可以使用阻止彈出命令blpop,brpopbrpoplpush。所有這些操作都被定義爲here


我能澄清:這聽起來像你有一大堆的RDB文件,並想從任意文件(「增量快照」)來讀取。這是對的嗎?

rdb文件本身並不是非常有用,除非您使用專用工具來解析它們。 Redis客戶端(如BookSleeve和ServiceStack)希望與正在運行的Redis實例進行通信。您的問題聽起來有點像「我有一系列日期的sql-server .bak文件;我如何從SomeTable獲取數據?」 - 答案是「首先將SQL Server加載到SQL Server中」。

啓動redis服務器非常容易,但它並不期望從多個rdb文件讀取。

選項:

  1. 手動解析RDB; see this thread - 預計疼痛
  2. 在需要時打開每個文件即時啓動Redis的服務器實例......嗯,它會工作,但流程管理可以得到「有趣」
  3. 啓動Redis的服務器實例每個文件提前...然後您需要擔心端口管理/映射,並監視新文件
  4. 熱負載使用DEBUG RELOAD; 然而,這是不是真的很支持,並且在測試中我不能得到正常的表現(尤其是,似乎重裝前做了SAVE,使得它不適合這種情況下)

但是,最終,您要從運行中選擇一系列不同的rdb文件,這不是Redis的正常使用情況。

如果我明白你的要求,那麼這不是一個客戶端的問題,更何況是一個特定於平臺的問題(.NET,C#,WCF等):首先你需要弄清楚如何你」重新運行服務器或以其他方式讀取文件。這將是最好的問在Redis DB

+0

太好了,謝謝澄清。我仍然試圖理解Redis的結構,以及如何查詢數據,所以這是一項正在進行的工作。所以我不想手動解析一個rdb,並且總是有一個活動的服務器在運行,所以我的問題需要一些重新措詞。隨着pub/sub,是否有任何密鑰保存到磁盤?我連接了Redis Admin UI並沒有看到任何鍵。 – ElHaix

+0

@ElHaix pub/sub完全是瞬態的:不存儲任何內容。如果您需要存儲空間,請改用隊列(= list)。我更新了你的編輯答案。 –

+0

Marc,閱讀http://openmymind.net/2011/7/5/Rethink-your-Data-Model/ - 我看到使用zadd/zrangebyscore可能是更好的解決方案,其中時間戳設置爲分數,我可以簡單地保存一個json對象作爲成員。你怎麼看?在Booksleeve中是否支持這些命令,以及在哪裏可以找到有關如何通過使用C#的Booksleeve發佈命令的示例? – ElHaix