Redis:对多个有序集合中的成员进行分页有序zrank获取

时间:2015-04-02 03:09:32

标签: redis

Redis新手。需要一些帮助。

使用案例: 我有成千上万的排行榜。他们的用户名具有适当的分数。用户可以属于一个或多个排行榜。我需要一种有效的方法来获得特定用户所属的每个排行榜的排名,最好按排名和分页排序。典型用户将属于数百个排行榜。

尽我所能: 我为每个包含他所属董事会的用户保留一套。为了获得用户的排名,我得到他的一组电路板,然后在集合中的每个电路板上,然后按照我的代码中的排名进行排序。这似乎非常低效,并且不支持分页。

我一直在阅读和集思广益,我被困住了。我需要的是:

user1:board(a,c,e)
board:a(user1,user23,user5)
board:b(user2,user7,user12)
board:c(user2,user1,user42)
board:d(user36,user4,user9)
board:e(user6,user19,user1)

SORT user1:board BY board:* - > user1

类似于按哈希字段排序,除了 - >在这种情况下,表示所​​提供成员的分类集合分数。如果存在这样的功能,是否会有任何性能提升?或者它与流水线所有的zranks相同?

感谢。

1 个答案:

答案 0 :(得分:1)

为了提高读取效率,您只需对写入进行微小更改即可。 目前,您将用户板存储在一个集合中,而是将它们存储在有序集合中。让我们称之为user_boards_sorted_set。 因此,每当您在排行榜排序集(例如board1)中增加用户1的得分时,您在board1上为用户1运行zrank,并且该等级在user_boards_sorted_set中成为user1的得分。 这样,user_boards_sorted_set总是包含用户所属的所有板,并且针对每个条目的分数包含他在该特定排行榜中的排名。在user_boards_sorted_set上运行ZRANGE,并且您将在所有排行榜中按用等级排序用户和他的排名。 / p>

更新:根据评论中的反馈,以及上述答案中的错误假设。

另一个好方法是使用Lua脚本来通过在用户所属的所有板上执行ZRANK来获得单独的板排名,并在LUA本身中对其进行排序。这将带来显着的性能提升,因为所有ZRANKS然后排序都在服务器端本身完成,并减少网络传输。