我已经为游戏中的每个级别(2000+级别)排序了set user_id:rating。有2000000用户。
我需要创建2个收视率-第一-所有用户前100,第二-每个玩家前5名朋友
首先可以用zrange很容易地解决
但是第二个是有问题的,因为平均每个用户有500个朋友
有两种方法:
1)我可以用zscore\zrank处理500个请求,并按后端对用户进行排序(请求太多,性能不好)
2)我可以为每个用户创建排序集,并在每个用户更新时在后台更新。(更多数据、更多RAM、更复杂)
可能还有我错过的其他选择吗?

最佳答案

我认为你在这里主要关心的应该是你的数据模型。每个用户都有自己的朋友吗?
我推荐这样的:
用户:{id}:friends值作为friends的id
用户:记分牌值作为用户ID,分数作为评分
每一个
作为对第一个问题的回答,您可以考虑使用管道,这将大大减少请求的数量,而且您仍然需要处理结果的排序。
如果您有前面描述的两个排序集,那么最好的答案是:
使用“zinterstore”命令获取两者之间的交集,并将结果存储在仅为此目的创建的排序集中。因此,新的排序集将包含所有用户的好友ID及其评分作为分数(这里需要小心,因为您需要指定新排序集的分数,它可以是分数的总和、最小值或最大值)。
参考:http://redis.io/commands/zinterstore
此时,使用一个简单的“zrevrangebyscore”并指定一个限制,将利用您正在寻找的排序结果。

关于redis - 使用Redis SORTED SET获得用户 friend 最高评分的最佳方式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38876310/

10-10 00:31
查看更多