- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我的项目随机匹配一对用户。他们可以退出游戏并与其他用户随机配对。
我不希望 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 中,因此:
您只有很小的机会不得不再次运行循环,但每次都会减轻查询(不再需要 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/
我是一名优秀的程序员,十分优秀!