v 站的在线人数是怎么统计的? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
imherer
V2EX    程序员

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

  •  
  •   imherer 2018-07-13 12:11:52 +08:00 6041 次点击
    这是一个创建于 2649 天前的主题,其中的信息可能已经有所发展或是发生改变。
    底部有一个 xx 人在线是怎么统计的呢? 查看个人信息里头像下面也有一个显示 online
    多长时间内和服务器有交互都算在线吗?

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

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

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

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

    这样就明了了,V 站的请求人数,实际上就是计算集合中元素的请求时间距当前时间小于 15 分钟的元素的数量。
    KeatingSmith
        16
    KeatingSmith  
       2018-07-13 17:39:23 +08:00
    具体的可以看这里: t/298920

    重新总结下,V 站会在每次请求上提取 session,将该 session 设置过期时间( 15 分钟)作为 key 存储,然后通过 dbsize() 获取到在线人数。
    leon19901130
        17
    leon19901130  
       2018-07-13 17:56:45 +08:00
    异步心跳可以统计
    junezk
      &nbs; 18
    junezk  
       2018-07-13 18:29:08 +08:00
    @opengps 现在很多框架,session 都两周才过期
    opengps
        19
    opengps  
       2018-07-13 18:58:06 +08:00 via Android
    @junezk 没见过这种,只见过用 cookie 一个月登录过期的
    lhx2008
        20
    lhx2008  
       2018-07-13 19:03:16 +08:00
    @KeatingSmith redis 的是懒删除,很多数据过期都会滞留,不知道影响有多大
    @fancyhan
    @owenliang
    @Vhc001
    owenliang
        21
    owenliang  
       2018-07-13 19:18:00 +08:00 via Android
    @lhx2008 懒删除就是内存不够才删除,所以直接存在第一层上还好,存在第二层就是大 key 了,真的不好说了。
    Vhc001
        22
    Vhc001  
       2018-07-13 19:34:58 +08:00
    越大越好
    你们看 V 站下面显示 1800 人在线,实际也就两三百人
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5832 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 01:36 PVG 09:36 LAX 18:36 JFK 21:36
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86