2015-04-02 47 views
0

Redis的新成員。需要一些幫助。Redis:多個排序集合中成員的分段有序zrank獲取

使用案例: 我有成千上萬的排行榜。他們有用戶名和適當的分數。用戶可以屬於一個或多個排行榜。我需要一種有效的方法來獲得特定用戶所屬的每個排行榜的排名,最好按排名和分頁排序。典型用戶將屬於數百個排行榜。

因爲我是GOT: 我爲每個包含他所屬董事會的用戶保留一套。爲了得到用戶的排名,我得到他的一套棋盤,然後在每個棋盤上縮小棋盤,然後在我的代碼中排名。這看起來效率很低,不支持分頁。

我一直在閱讀和頭腦風暴,我卡住了。我需要的是這樣的:

USER1:板(A,C,E)
板:一個(用戶1,user23,USER5)
板:B(用戶2 user7,USER12)
板:C (用戶2,用戶1,user42)
板:d(user36,USER4,USER9)
板:E(user6,user19,用戶1)

SORT USER1:板BY板:* - > USER1

類似於通過散列字段進行排序,除了 - >在這種情況下意味着所提供的會員的排序集合分數。如果存在這樣的特徵,會不會有任何性能改進?或者它會和所有的zranks流水線一樣嗎?

謝謝。

回答

1

爲了讓您的讀取效率更高,您只需對寫入操作進行小改動即可。 目前,您正在將用戶板存儲在一個集合中,而是將它們存儲在一個有序集合中。我們稱之爲user_boards_sorted_set。 因此,無論何時您增加排行榜排序集(例如board1)中的用戶1的分數,您都會在board1上爲用戶1運行zrank,並且該排名將成爲user_boards_sorted_set中user1的分數。 這種方式user_boards_sorted_set總是包含用戶所屬的所有棋盤,並且對每個條目的分數都包含他在該特定排行榜中的排名。在user_boards_sorted_set上運行ZRANGE,您將在所有排行榜中按排名排列用戶和他的排名。

更新:基於評論中的反饋以及上述答案中的錯誤假設。

另一個好方法是使用Lua腳本通過在用戶所屬的所有電路板上執行ZRANK來獲取單獨的電路板排名,然後在LUA中對它進行排序。這將帶來顯着的性能增益,因爲所有的ZRANKS和排序都是在服務器端完成的,並減少了網絡傳輸。

+0

Upvoted :)但是這裏有一個棘手的問題 - 如果user1的分數受到另一個用戶分數變化的影響會怎麼樣 - 這意味着在board1中,user1的ZRANK發生了變化,因爲user5踢了他的屁股? – 2015-04-02 11:03:25

+0

Dhruv,我想到了這種方法,但正如Itamar所說,用戶的排名受其他人的活動影響。所以即使沒有他做任何事情,他的最高等級也可能下降我開始得出這樣的結論:如果不單獨對每塊電路板進行評估,我所需要的是不可能的。 – Andre 2015-04-03 20:27:11