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

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

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

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

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

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

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

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

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

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

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

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

© 2021 V2EX