做用户随机匹配的正确做法是?直接在内存存储还是使用数据库?

2017-06-04 08:40:31 +08:00
 xiaoc19

需求是在 2 分钟内随机匹配一个用户,
目前使用的是 PostgreSQL,
请问有什么框架可以直接支持,
或者有经验的指教一下如何设计这个匹配比较合理

3437 次点击
所在节点    程序员
16 条回复
prasanta
2017-06-04 09:16:08 +08:00
当然是先把用户必要字段放到 redis 里面啦,后台开 celery 定时任务
xiaoc19
2017-06-04 09:29:16 +08:00
@prasanta 没啥经验,操作起来难度如何,哈哈
owt5008137
2017-06-04 09:31:19 +08:00
如果是做游戏匹配的话我会自己写。放内存
xiaoc19
2017-06-04 09:33:50 +08:00
@owt5008137 我想实现的就是类似斗地主这样,但只有两个人,能说说你的思路和做法吗
mringg
2017-06-04 09:50:38 +08:00
用 redis 维护队列不错
owenliang
2017-06-04 09:54:41 +08:00
我也想知道不走内存的方案
reus
2017-06-04 09:55:34 +08:00
你用 postgresql,难道数据就不在内存了么……
buffer 开大点,随便搞。
何况 postgresql 也有 notify 功能,完全没有用 redis 队列的必要。
xiaoc19
2017-06-04 09:57:09 +08:00
@prasanta
@mringg
是否 Kafka 也能胜任,而且更简单点?
xiaoc19
2017-06-04 09:58:01 +08:00
@reus 两者性能还是有差距的吧?
xyjtou
2017-06-04 09:59:42 +08:00
@reus
sql 的 buffer 开大点(比如 16G~32G 内存使用),和 redis 允许使用同样大小的内存,效率差别大吗?
owenliang
2017-06-04 10:00:49 +08:00
我理解这种全内存简单吧,内存里只放用户 id,客户端心跳保持。 数据结构需要线性,考虑用堆吧。
owt5008137
2017-06-04 10:07:26 +08:00
匹配这种心跳都可以省了。
收到发起匹配请求的游戏服先取消原先匹配,(再随机匹配服务器,匹配服收到请求后进匹配策略池,进超时淘汰队列),匹配成功后推送匹配结果回来,完。
括号里的可以加服务器自动重试。或者客户端直接定时发匹配重试请求好了
reus
2017-06-04 10:08:48 +08:00
@xiaoc19
@xyjtou
效率只需要达到设计要求就可以了,这个要自己测试优化,pg 没问题的,又不是多麻烦的需求。
如果需求变复杂,例如说不是随机的,是有一些条件的,用 sql 数据库就比 redis 方便得多。
owenliang
2017-06-04 10:10:54 +08:00
sql 有啥好算法吗 考虑时间复杂度 b 树和 hash 都难以实现高效的随机吧。
wplct
2017-06-04 11:25:21 +08:00
没必要随机吧,开几个队列好了
leeg810312
2017-06-04 13:06:33 +08:00
匹配表里用随机函数 select 2 个用户进行匹配,然后从匹配表中删除,这个过程作为一个事务,也就具有排他性了。像楼上所说,考虑扩展功能,需要放在表中,redis 相比之下就无法满足需求了。要说性能,pg 也是很强的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/365778

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX