gpt4 book ai didi

postgresql - Postgres : NOT IN array instead of NOT EXISTS expression

转载 作者:可可西里 更新时间:2023-11-01 11:25:54 26 4
gpt4 key购买 nike

我的项目随机匹配一对用户。他们可以退出游戏并与其他用户随机配对。

我不希望 2 个用户可以在一段时间内一次又一次地匹配。

我将所有数据(如 user_id、语言、性别等)保存在 postgres 表中。

为了暂时不再匹配他们,我使用了 Redis 排序列表和 Unix 时间来存储匹配的用户对。我决定使用 Redis,因为我的项目每天存储 100 万对夫妇。

当我必须将一个用户与另一个用户匹配时,我从 redis 获取在过去 x 分钟内与他匹配的用户列表,然后我将它们传递给“where user_id not in ()”(它们永远不会超过200,如果我将其限制为 200),当我运行查询以查找可用用户与他匹配时。

这样我就不能使用应该比 IN 更快的 exists 或 join 表单。然后我是否应该考虑使用 postgres 来存储这对夫妇,尽管我应该每天写 100 万个(当然我可以在一段时间后删除这些行),使用 EXISTS 或 JOIN 运行查询而不是 NOT IN 传递元组?

我想知道性能。

最佳答案

这里得做一些概率......

假设您有 Nu = 100 万在线用户。

用户今天点击“匹配”Nm = 200 次。

用户再次点击“匹配”。我们希望将他们与一个随机用户进行匹配,该用户不属于之前 200 次匹配的列表。

随机选择一个用户,我们只有 Nm/Nu 的概率选择一个在最近 200 次匹配中与该用户匹配的用户。这只是 200/10000000 = 0.002% 的概率。

在这种情况下,由于过去的比赛列表没有存储到 postgres 中,因此:

  • 只需获得一个匹配项,而不必费心将 200 个整数插入 SELECT...
  • 然后检查匹配的用户是否在之前的匹配列表中
  • 如果是,重复。

您只有很小的机会不得不再次运行循环,但每次都会减轻查询(不再需要 postgres 解析 200 个整数)。

现在,如果您将匹配数据存储到 postgres 而不是 redis 中……每天 1M INSERTS 是 11.5 INSERTS/秒,这可以忽略不计……那么您可以通过一个查询来实现它。只要 pg 在您的随机数生成器上使用嵌套循环并在 LIMIT 1 处停止,它就可以正常工作。

关于postgresql - Postgres : NOT IN array instead of NOT EXISTS expression,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45401159/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com