技术解析

v 站底部的在线人数是如何实现的?
0
2021-06-02 19:12:46
idczone

xxx 人在线 最高纪国外服务器录 xxx


先这样,在那样

然后就好了

懂了

3608 人在线最高记录 5497
就这样咯~

发帖之前 Google 了吗?上一次披露应该是利用 Redis 的 TTL 实现的

他想问的应该是如何统计的吧?
我最近做了个类似的模块,原理大致为:使用 redis 添加每个访客的唯一 id 并设置 1 分钟过期时间,每次访问统计以下当前存活的数量就是最近一分钟在线的数量了。 最高应该是直接落库了。

看了一下,无心跳轮询,那就是最后请求操作时间算?

这点数据,redis 随便搞个自增 key 就搞定了,甚至关系型数据库都可以

有几种常见的策略。
1 、网页轮询报活。
2 、token 不过期就算 online
3 、真,在线。(比如用长连接)
4 、最后一次请求时间小于 XX 就算在线。
从线向上观察,要么是 2 、要么是 4 、
总之,其实未必非常准确。

我还是用 ws 吧,redis 的统计不太准

这种数据要求准确的意义是啥? - -

直接看一定时间周期内有多少用户请求过后端 api 就行了。

随机数 [doge]

大概想了一个可行的方案
每个用户访问首页则对 user_{userId}_visit 设定 10 分钟的过期, 如果失败, 则 10 分钟内统计过, 跳过
如果成功, 那么这是一个新的用户, 则对当前分钟的计数 key 自增 1, visit_count_{minute}
统计在线人数把前十分钟的计数 key 加起来就行
一个简单的优化是把总人数提前算好, 永远只拿这种数字. 可以每分钟的第 5 秒累加一下前十分钟的数然后放到一个新的 key 里, 这样每次都读这个 key 就行

@livid

有问题,万一用户就不通过首页进入,通过其他地方在跳转浏览呢,这种方法要跟踪所有入口
应该是第二种(有活用户自动续期功能),第四种要跟踪所有 api,第一种可以通过看客户端网络请求,如果没有轮询就不是
ws 对网络和服务器要求太高,v 站本身在外面,有干扰,用 ws 太为难了
你说的是怎么存储,大家讨论的是怎么判断用户是否在线
以上是我的判断,看站长怎么说吧

历史帖
https://www.v2ex.com/t/298920

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服