2013-06-24 63 views
0

我在寫一個使用Redis的非常簡單的社交網絡應用程序。Redis多個請求

每個用戶都有一個排序的集合,其中包含其Feed中的項目的ID。如果我想顯示他們的飼料,我做以下步驟:

  1. 使用ZREVRANGE獲得項目的id的飼料
  2. 使用HMGET獲得飼料(每源項目是一個字符串)

但現在,我也想知道用戶是否喜歡飼料項目。所以我有一組與每個包含喜歡飼料項目的用戶的ID的飼料項目相關聯。

如果我得到15個供稿項目,現在我必須向Redis另外執行15個請求,以便查找每個供稿項目(如果當前用戶已對其進行了評論)(通過檢查每個組中是否存在每個供稿飼料)。

這樣就需要15 + 1個請求。

使用Redis時,這種類型的查詢是否被視爲「正常」?有沒有更好的方法可以構建數據以避免這麼多要求?

我正在使用redis-rb gem。

+0

流水線也許?或一個Lua腳本? – akonsu

回答

0

您可以輕鬆地重構代碼,以便通過使用管道(redis-rb支持)將15個請求合併爲一個。

你從有序集合的ID與第一個請求,然後使用它們(使用管道)

用這種方法得到你需要根據這些結果的許多鍵,你應該在2個請求總數而不是16,並保持你的代碼非常簡單。

作爲替代方案,您可以使用lua腳本並在一個請求中獲取所有內容。

0

這種數據庫(非關係數據庫),你必須在多個請求之間進行權衡幷包含一些數據冗餘。

您應該分別分析每一種情況下,並考慮到一些方面,如:

  1. 如何頻繁這個數據將被訪問?
  2. 這個冗餘將消耗多少空間?
  3. 爲了獲得所有數據,我將不得不做多少次請求,而不是冗餘?
  4. 性能是一個問題?

在你的情況下,我會建議爲每個用戶保留一個Set/Hash或者只是一個JSON編碼數據,並帶有所有最近用戶交互的歷史記錄,比如註釋,喜歡等等。每次用戶訪問您只需閱讀Feed和歷史記錄;只有兩個請求。

有一點需要記住,每個用戶交互,您都必須更新所有冗餘數據。