2011-12-21 65 views
0

比方說,我在我的Redis數據庫5項:與Redis的動態排序

  • news::id:最後消息ID;
  • news::list:所有新聞ID的列表;
  • news:n其中n是新聞ID:包含字段的散列,如titleurl等;
  • news:n:upvotes:所有用戶的標識誰upvoted的消息,從而使upvotes數量的列表。
  • news:n:downvotes:所有用戶的標識誰downvoted的消息,從而使downvotes數量的列表。

然後我有多個排名算法,其中rank =

  1. upvotes_count;
  2. upvotes_count - downvotes_count;
  3. upvotes_count - downvotes_count - age;
  4. upvotes_count/downvotes_count;
  5. age

現在如何根據這些算法對這些消息進行排序?

我想過在每張選票上計算不同的排名,但是如果我介紹一種新算法,我需要計算所有新聞的新排名。

EVAL可以幫助,但它將不會提供,直到v2.6,這肯定我不想等待。

最終,我會檢索所有消息,並把它們在一個Python列表。但它又轉化爲高內存使用率,更不用說Redis將其數據存儲在內存中的事實。

那麼,有沒有做到這一點適當的方式,或者我應該只是移動到MongoDB的?

+0

你可以給不同的參數賦予不同的(合理的)權重嗎?比如'100000000 * upvotes_count - 10000 * downvotes_count - age'並且根據這個加權和只排序一次? – eumiro 2011-12-21 12:27:21

+0

@eumiro Nope,**這裏的目標是能夠用不同的algos **進行排序。另請參閱我的編輯。 – seriousdev 2011-12-21 12:34:54

+0

對不起,劫持這些評論,但你確實刪除了http://stackoverflow.com/questions/8626415/git-log-with-dulwich(git-log with Dulwich)。你找到答案了嗎? – VonC 2011-12-26 00:22:53

回答

0

您可以通過存儲在鍵中的常量進行排序。

在你的例子中,我可以使用Redis來簡單地排序1.。如果您在計算其他表達式值之後再存儲它們,您也可以按它們排序。對於1.,您需要將列表數存儲在某處,我將假設爲news:n:upvotes:count

捕獲的是使用SORT命令。例如,第一類將是:

SORT news::list BY news:*:upvotes:count GET news:*->title GET news:*->url 

...以獲得根據upvotes排序,按月牙順序的標題和URL。

還有修飾符,用於alpha排序和asc/desc排序。完全閱讀命令頁面,這是值得的。PS:您可以包裝計數,存儲,排序並可能刪除環境中的計數(事務)。

+0

嘿,謝謝你的回答。我實際上已經想出瞭如何對'1'進行排序,但是我似乎無法爲'2-4'這樣做。它甚至有可能嗎? – seriousdev 2011-12-22 16:15:33

+0

歡迎。正如我所說的,如果您將計算存儲在新鍵上,則可以使用上面的sort命令(在'BY'子句中指定新鍵,用'*'替換'n')。 Star運算符將被在'SORT'命令後面的鍵中的每個id替換。希望這是有道理的。 – Niloct 2011-12-22 16:48:39

+0

哦,我明白了,但我不想存儲隊伍。 – seriousdev 2011-12-22 20:14:03