你在redis中有一个有序集A,你不时地向它添加新元素,它们按等级排序,例如您还有一个有序集B.
有没有办法检查集合A中是否存在超过20秒的元素,并将它们移动到有序集合B
因为这种检查操作非常频繁,并且列表可能非常大,迭代遍历集合中的每个元素都不是一个好的解决方案。需要最快的一个。
感谢。
更新: 这是我想要做的: 基本上这个想法是,想象你有一种游戏服务器,当他们提出战斗请求时匹配对手。目前的设计是每个请求都得到了集合,并且排名/分数是玩家等级。这样,列表中彼此靠近的每2名球员都是完美的比赛。每隔5秒左右一个脚本被调用,从集合的顶部拉出50行,并将它们与2匹配(并删除它们)。这工作正常,我认为这是一个非常快速的解决方案。但随后创建了一个Bot(AI)玩家的想法来了。所以当玩家等待太长时间时,他会得到一个机器人(AI)玩家。而且我无法找到一种方法来看“谁在等待太长时间”基本上也许整个想法都是错误的......所以欢迎任何更好的想法:)非常感谢。
答案 0 :(得分:4)
如果排序集中的分数是unix时间戳,则可以使用zrange从A集中获取最旧的NN项。然后可以执行检查,添加限定条目以设置B,然后删除它们来自A组。
如果你在A组中的得分不是基于时间戳,那么你必须完全迭代你的A组,或者重新考虑你的设计。 Redis键在添加它们时没有固有的可用时间戳(对于键中的项目(例如有序集合),它具有双重真实性),因此它必须是您专门创建和跟踪的内容。也许如果你分享更多关于你在做什么以及为什么我们可以提供更多细节的帮助。
编辑: 根据你的问题的补充,我建议尝试类似于@akonsu提出的解决方案。
具体做法是: Sorted-Set-A:排名与现在一样的球员。
排序-SET-B: 使用时间戳作为人进入队列的时间,存储他们的用户ID。换句话说,当你使用他们的排名& ID,您使用时间戳和ID添加到SetB。
当你匹配玩家时,你将它们从两个组中删除。如果您使用zrange命令将您的用户组与SetB匹配以获取X最旧的条目,您将按照它们的输入顺序(如FIFO)排队等待它们。然后,您可以在SetA上使用zrange命令,其等级为+/-您需要的任何等级范围。如果你得到一个匹配,你可以从两个集合中移除它们并继续进行比赛。
如果SetA中没有合适的对手,并且他们的时间戳足够老,则您与AI匹配,然后从两个组中移除它们并继续前进。
本质上,它是用户的索引队列 - > timestamp。这样做意味着所有用户的队列时间更短,因为您现在按照队列长度的顺序匹配它们。您仍然使用SetA根据玩家的等级进行匹配,但现在您根据时间进行索引和优先排序。
具体实施可能比这更有趣,但作为总体策略,我认为这符合您的需要。