2015-04-02 50 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