![]() | 1 Akitora 2024-04-11 15:50:13 +08:00 redis+心跳请求 |
![]() | 2 Joseph0717 OP @Akitora 谢谢,我研究研究 |
![]() | 3 thxgod 2024-04-11 15:52:33 +08:00 要针对你对 在线 这个概念的定义来决定方案吧。 多久活跃一次认为是在线状态 |
![]() | 4 Joseph0717 OP @thxgod 只要登录就在线 |
![]() | 5 lujiaosama 2024-04-11 16:01:09 +08:00 按照我的构想, 是 websocket 链接定时判断用户是否在线. |
![]() | 6 InDom 2024-04-11 16:08:10 +08:00 在线有两种判断逻辑: 一、论坛常见的,多久时间内有过操作就算在线,关闭网页或者长久不动都不算。 二、实时的,必须与服务器保存长连接,不需要操作,就可以算在线。 既然你选择了 MySQL ,那么应该是情况一,数据库(不只是 mysql ,只要是有地方统一记录查询即可)记录一下最后一次活动的时间,每次都更新,判断时就检查最后一次活动时间是否在某个范围内。 如果你要选择二,那么你要与服务器保持长连接,比如 ws:// ,这样你的服务端是可以得到客户端链接过来的 client ,检查是否在线就检查是否有这个用户的客户端链接即可。 实时性要求不高的,一般选情况一,否则情况二。 |
![]() | 7 InDom 2024-04-11 16:09:38 +08:00 修正:情况一、关闭网页可能也会在线一段时间,长久不动一段时间就会掉线。 |
![]() | 8 cheneydog 2024-04-11 16:10:29 +08:00 用户断网了,或者突然×掉浏览器,多久算离线? |
![]() | 9 Joseph0717 OP @lujiaosama 目前是这样的,但是要判断好友状态,不是自己 |
![]() | 10 lyxxxh2 2024-04-11 16:17:14 +08:00 1. websocket 否决,坑太多要解决。参考 https://learnku.com/articles/83276 2. sse 推荐,开发最简单。每隔 3 秒更新最后在线时间 3. ajax 轮询,跟 2 差不多,性能损耗多些。 |
![]() | 11 Hopetree 2024-04-11 16:36:54 +08:00 1. 用户在浏览器的每个页面操作(中间件实现)都去更新一下用户 session 的时间 2. 读取某个时间内的 session 数,就是在线用户,比如更新时间在 1 分钟内的,说明 1 分钟内这些用户有请求操作 |
12 qingyingwan 2024-04-11 20:39:09 +08:00 上面有不少靠谱的方法,常规应用已经够了 量少就维护在 session 内存即可,量大就用 redis 之类的缓存,存数据库没必要 如果要求实时,比如在线游戏之类的,可以使用 WebRTC ,服务器只负责搭桥不负责通信 |
13 qingyingwan 2024-04-11 20:47:17 +08:00 @Joseph0717 按照你对在线的定义,不需要那些复杂的东西了,可以判断登录用户的 token 或者 session 数据是否过期就可以判断是否在线了。只要服务端有用户的登录数据且没过期,就表示这个用户是登录了的。 |
![]() | 14 lasuar 2024-04-11 21:35:54 +08:00 最简单的办法,不需要引入 ws 什么长连接,就 http 轮询保持会话,后台 mysql/redis 维护一个 online 字段就行了。 |
15 Cruzz 2024-04-11 22:03:41 +08:00 复杂 ws+redis 简单 http 轮训+mysql |
16 realJamespond 2024-04-12 10:15:44 +08:00 小几十个人 mysql ,几百上千人用 redis |
![]() | 17 isSamle 2024-04-12 10:43:27 +08:00 rabbitmq 直接挂在后面,断了就变更状态为下线 |
18 ON9 2024-04-12 11:00:32 +08:00 via Android 问一下 ws 实现是话是更加复杂吗?复杂在哪里?我感觉 http 轮询会消耗很多资源啊 |
19 vdig 2024-04-15 11:16:04 +08:00 打 cod 吗 |
![]() | 20 Joseph0717 OP @vdig 玩腻了,已删 |