V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
Joseph0717
V2EX  ›  MySQL

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

  •  
  •   Joseph0717 · 18 天前 · 2028 次点击
    最近练手后端,express ,express-session ,mysql ,判断好友是否在线,是不是在用户表里加一个是否在线的字段来判断,还是直接用 session 就能检测到
    第 1 条附言  ·  18 天前
    谢谢大家,已经用上了 redis
    20 条回复    2024-04-17 14:19:24 +08:00
    Akitora
        1
    Akitora  
       18 天前
    redis+心跳请求
    Joseph0717
        2
    Joseph0717  
    OP
       18 天前
    @Akitora 谢谢,我研究研究
    thxgod
        3
    thxgod  
       18 天前
    要针对你对 在线 这个概念的定义来决定方案吧。 多久活跃一次认为是在线状态
    Joseph0717
        4
    Joseph0717  
    OP
       18 天前
    @thxgod 只要登录就在线
    lujiaosama
        5
    lujiaosama  
       18 天前
    按照我的构想, 是 websocket 链接定时判断用户是否在线.
    InDom
        6
    InDom  
       18 天前
    在线有两种判断逻辑:

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

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

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

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

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

    3. ajax 轮询,跟 2 差不多,性能损耗多些。
    Hopetree
        11
    Hopetree  
       18 天前
    1. 用户在浏览器的每个页面操作(中间件实现)都去更新一下用户 session 的时间
    2. 读取某个时间内的 session 数,就是在线用户,比如更新时间在 1 分钟内的,说明 1 分钟内这些用户有请求操作
    qingyingwan
        12
    qingyingwan  
       18 天前
    上面有不少靠谱的方法,常规应用已经够了
    量少就维护在 session 内存即可,量大就用 redis 之类的缓存,存数据库没必要
    如果要求实时,比如在线游戏之类的,可以使用 WebRTC ,服务器只负责搭桥不负责通信
    qingyingwan
        13
    qingyingwan  
       18 天前
    @Joseph0717 按照你对在线的定义,不需要那些复杂的东西了,可以判断登录用户的 token 或者 session 数据是否过期就可以判断是否在线了。只要服务端有用户的登录数据且没过期,就表示这个用户是登录了的。
    lasuar
        14
    lasuar  
       18 天前
    最简单的办法,不需要引入 ws 什么长连接,就 http 轮询保持会话,后台 mysql/redis 维护一个 online 字段就行了。
    Richared
        15
    Richared  
       18 天前
    复杂 ws+redis 简单 http 轮训+mysql
    realJamespond
        16
    realJamespond  
       17 天前
    小几十个人 mysql ,几百上千人用 redis
    isSamle
        17
    isSamle  
       17 天前
    rabbitmq 直接挂在后面,断了就变更状态为下线
    ON9
        18
    ON9  
       17 天前 via Android
    问一下 ws 实现是话是更加复杂吗?复杂在哪里?我感觉 http 轮询会消耗很多资源啊
    vdig
        19
    vdig  
       14 天前
    打 cod 吗
    Joseph0717
        20
    Joseph0717  
    OP
       12 天前
    @vdig 玩腻了,已删
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   950 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 21:11 · PVG 05:11 · LAX 14:11 · JFK 17:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.