本人前端,请教大家一个后端问题,谢谢

2024-04-11 15:49:13 +08:00
 Joseph0717
最近练手后端,express ,express-session ,mysql ,判断好友是否在线,是不是在用户表里加一个是否在线的字段来判断,还是直接用 session 就能检测到
3131 次点击
所在节点    MySQL
20 条回复
Akitora
2024-04-11 15:50:13 +08:00
redis+心跳请求
Joseph0717
2024-04-11 15:51:46 +08:00
@Akitora 谢谢,我研究研究
thxgod
2024-04-11 15:52:33 +08:00
要针对你对 在线 这个概念的定义来决定方案吧。 多久活跃一次认为是在线状态
Joseph0717
2024-04-11 15:53:42 +08:00
@thxgod 只要登录就在线
lujiaosama
2024-04-11 16:01:09 +08:00
按照我的构想, 是 websocket 链接定时判断用户是否在线.
InDom
2024-04-11 16:08:10 +08:00
在线有两种判断逻辑:

一、论坛常见的,多久时间内有过操作就算在线,关闭网页或者长久不动都不算。
二、实时的,必须与服务器保存长连接,不需要操作,就可以算在线。

既然你选择了 MySQL ,那么应该是情况一,数据库(不只是 mysql ,只要是有地方统一记录查询即可)记录一下最后一次活动的时间,每次都更新,判断时就检查最后一次活动时间是否在某个范围内。

如果你要选择二,那么你要与服务器保持长连接,比如 ws:// ,这样你的服务端是可以得到客户端链接过来的 client ,检查是否在线就检查是否有这个用户的客户端链接即可。

实时性要求不高的,一般选情况一,否则情况二。
InDom
2024-04-11 16:09:38 +08:00
修正:情况一、关闭网页可能也会在线一段时间,长久不动一段时间就会掉线。
cheneydog
2024-04-11 16:10:29 +08:00
用户断网了,或者突然×掉浏览器,多久算离线?
Joseph0717
2024-04-11 16:12:11 +08:00
@lujiaosama 目前是这样的,但是要判断好友状态,不是自己
lyxxxh2
2024-04-11 16:17:14 +08:00
1. websocket 否决,坑太多要解决。参考 https://learnku.com/articles/83276

2. sse 推荐,开发最简单。每隔 3 秒更新最后在线时间

3. ajax 轮询,跟 2 差不多,性能损耗多些。
Hopetree
2024-04-11 16:36:54 +08:00
1. 用户在浏览器的每个页面操作(中间件实现)都去更新一下用户 session 的时间
2. 读取某个时间内的 session 数,就是在线用户,比如更新时间在 1 分钟内的,说明 1 分钟内这些用户有请求操作
qingyingwan
2024-04-11 20:39:09 +08:00
上面有不少靠谱的方法,常规应用已经够了
量少就维护在 session 内存即可,量大就用 redis 之类的缓存,存数据库没必要
如果要求实时,比如在线游戏之类的,可以使用 WebRTC ,服务器只负责搭桥不负责通信
qingyingwan
2024-04-11 20:47:17 +08:00
@Joseph0717 按照你对在线的定义,不需要那些复杂的东西了,可以判断登录用户的 token 或者 session 数据是否过期就可以判断是否在线了。只要服务端有用户的登录数据且没过期,就表示这个用户是登录了的。
lasuar
2024-04-11 21:35:54 +08:00
最简单的办法,不需要引入 ws 什么长连接,就 http 轮询保持会话,后台 mysql/redis 维护一个 online 字段就行了。
Cruzz
2024-04-11 22:03:41 +08:00
复杂 ws+redis 简单 http 轮训+mysql
realJamespond
2024-04-12 10:15:44 +08:00
小几十个人 mysql ,几百上千人用 redis
isSamle
2024-04-12 10:43:27 +08:00
rabbitmq 直接挂在后面,断了就变更状态为下线
ON9
2024-04-12 11:00:32 +08:00
问一下 ws 实现是话是更加复杂吗?复杂在哪里?我感觉 http 轮询会消耗很多资源啊
vdig
2024-04-15 11:16:04 +08:00
打 cod 吗
Joseph0717
2024-04-17 14:19:24 +08:00
@vdig 玩腻了,已删

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

https://ex.noerr.eu.org/t/1031675

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

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

© 2021 V2EX