IM 聊天室中,实时更新当前在线用户列表如何实现?

最近想做个im聊天室学习一下workerman, 选了gatewayworker这个框架,今天做到聊天室的在线用户列表,遇到了下面的问题:

用户列表怎样能及时更新,同时能保证性能?

我首先想到了用定时器通过websocket每几秒发送在线用户到前台,但是这样有个弊端就是,每次发送都会查询用户信息,这样数据库方面就会有压力,感觉并不是一个好的解决方案

于是我又想到了第二种,连接进入聊天室后,先查询一次在线用户列表,然后有人进入或者退出的时候,向所有在线用户推送上线/下线信息,然后前端更新状态

暂时只想到一个看起来可行的方案,由于本人没有这方面的经验,所以请问一下各位,即时通讯类似的功能都是怎样实现的

最佳答案

感谢各位,看了一下官方聊天室demo的源码,感觉自己确实是想跑偏了,有相同问题的同学,可以参考一下这个项目 workerman-chat

3年前 评论
讨论数量: 6

websocket 不需要定时器了吧?后端事件监听,然后发送给前端就好了。

3年前 评论
Mr_dreamer (楼主) 3年前
小李世界 (作者) 3年前

官方有个聊天室例子实现了这个功能,可以参考下

3年前 评论
Mr_dreamer (楼主) 3年前
JeffreyBool

我给你说说我的想法吧,正确的做法是 长连服务会维护一个 连接的 map , 当用户进入某个房间, 会将当前的连接会话和房间做关联绑定, 至于你说的在线用户列表,可以用户 进入房间,长连服务通知这个房间的客户端有人进来了,这种一般都是客户端维护, 当然长连服务也能直接查询,客户端 每隔多久可以和长连服务做个校准。防止网络因素客户端没收到的问题,实时在线列表一般准确率不是要求太高

3年前 评论
Mr_dreamer (楼主) 3年前
JeffreyBool

至于你说的数据库会有压力,一般长连服务这种都是维护在内存里的,性能非常好, 高性能首先要应该考虑到 Redis 而不是 MySQL

3年前 评论

我之前是用第二种的 redis存储存入用户id,
WhereIn查询在线用户

只用mysql都没问题, cpu都不过10%,讲性能有点太那个了…。

3年前 评论

感谢各位,看了一下官方聊天室demo的源码,感觉自己确实是想跑偏了,有相同问题的同学,可以参考一下这个项目 workerman-chat

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!