• 请不要在回答技术问题时复制粘贴 AI 生成的内容
imherer
V2EX  ›  程序员

v 站的在线人数是怎么统计的?

  •  
  •   imherer · Jul 13, 2018 · 6993 views
    This topic created in 3035 days ago, the information mentioned may be changed or developed.
    底部有一个 xx 人在线是怎么统计的呢? 查看个人信息里头像下面也有一个显示 online
    多长时间内和服务器有交互都算在线吗?

    之前看好多 bbs 也有统计在线的,这种非长连接的在线是怎么统计的呢?
    22 replies  •  2018-07-13 19:34:58 +08:00
    ericls
    ericls
    Jul 13, 2018 via iPhone❤️1
    1
    应该是每一个 session 有一个在线的 timeout 只要在 timeout 之内有活动 就算在线
    akira
    akira
    Jul 13, 2018❤️1
    2
    活动过以后 一定时间内视为在线. 不是实时的,也不是准确的
    opengps
    opengps
    Jul 13, 2018 via Android❤️1
    3
    最古老的 session 方式足够了
    salamanderMH
    salamanderMH
    Jul 13, 2018❤️1
    4
    只能用 session
    jaaazzz
    jaaazzz
    Jul 13, 2018 via Android❤️1
    5
    php swoole 与 websocket 了解一下
    GoPython
    GoPython
    Jul 13, 2018❤️1
    7
    我发现,我没有刷新页面,但是,有消息的时候,还是会提醒。所以,是不是应该用了 websocket ?
    GoPython
    GoPython
    Jul 13, 2018❤️1
    8
    哈哈,原来 站长已经说过了。我发现,好像没有站内搜索。导致了,经常有重复的提问?
    sampeng
    sampeng
    Jul 13, 2018❤️1
    9
    12345 人和 11111 人在在线统计上没有任何区别
    Infernalzero
    Infernalzero
    Jul 13, 2018❤️1
    10
    你站站长之前好像说过,他用的 redis 的 dbsize
    owenliang
    owenliang
    Jul 13, 2018 via Android❤️1
    11
    redis 实现,心跳上来以后 pipeline 从前一分钟的集合删除 uid,向当前分钟的集合添加 uid。

    在线用户数等于前一分钟集合大小+当前分钟集合大小。

    pipeline 记得末尾带一个 expire 命令,另外应该把用户打散到多个集合,避免单个集合过期回收内存时 stop the world.
    salamanderMH
    salamanderMH
    Jul 13, 2018
    12
    @GoPython 你刷个页面看看,都没有 WS 的请求
    fancyhan
    fancyhan
    Jul 13, 2018
    13
    redis 很容易
    GoPython
    GoPython
    Jul 13, 2018
    14
    @salamanderMH 额,好吧。刚才确认了.确实是
    KeatingSmith
    KeatingSmith
    Jul 13, 2018
    15
    根据上面的回复,下面是我的猜想:

    对于 V 站的每一请求,都会记录 IP 和请求时间。然而,V 站在线状态的判断依据是「是否在十五分钟内有请求。」因此,用户的每一次请求时间都会记录在某个集合中。当然,是要先判断 IP 是否已经存在,如果存在,则只更新请求时间。

    这样就明了了,V 站的请求人数,实际上就是计算集合中元素的请求时间距当前时间小于 15 分钟的元素的数量。
    KeatingSmith
    KeatingSmith
    Jul 13, 2018
    16
    具体的可以看这里: https://www.v2ex.com/t/298920

    重新总结下,V 站会在每次请求上提取 session,将该 session 设置过期时间( 15 分钟)作为 key 存储,然后通过 dbsize() 获取到在线人数。
    leon19901130
    leon19901130
    Jul 13, 2018
    17
    异步心跳可以统计
    junezk
    junezk
    Jul 13, 2018
    18
    @opengps 现在很多框架,session 都两周才过期
    opengps
    opengps
    Jul 13, 2018 via Android
    19
    @junezk 没见过这种,只见过用 cookie 一个月登录过期的
    lhx2008
    lhx2008
    Jul 13, 2018
    20
    @KeatingSmith redis 的是懒删除,很多数据过期都会滞留,不知道影响有多大
    @fancyhan
    @owenliang
    @Vhc001
    owenliang
    owenliang
    Jul 13, 2018 via Android
    21
    @lhx2008 懒删除就是内存不够才删除,所以直接存在第一层上还好,存在第二层就是大 key 了,真的不好说了。
    Vhc001
    Vhc001
    Jul 13, 2018
    22
    越大越好
    你们看 V 站下面显示 1800 人在线,实际也就两三百人😄
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   3006 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 52ms · UTC 10:57 · PVG 18:57 · LAX 02:57 · JFK 05:57
    ♥ Do have faith in what you're doing.