![]() | 1 ericls 2018-07-13 12:18:09 +08:00 via iPhone ![]() 应该是每一个 session 有一个在线的 timeout 只要在 timeout 之内有活动 就算在线 |
![]() | 2 akira 2018-07-13 12:23:36 +08:00 ![]() 活动过以后 一定时间内视为在线. 不是实时的,也不是准确的 |
![]() | 3 opengps 2018-07-13 12:25:03 +08:00 via Android ![]() 最古老的 session 方式足够了 |
4 salamanderMH 2018-07-13 12:25:10 +08:00 ![]() 只能用 session |
![]() | 5 jaaazzz 2018-07-13 12:27:44 +08:00 via Android ![]() php swoole 与 websocket 了解一下 |
![]() | 7 GoPython 2018-07-13 12:30:09 +08:00 ![]() 我发现,我没有刷新页面,但是,有消息的时候,还是会提醒。所以,是不是应该用了 websocket ? |
![]() | 8 GoPython 2018-07-13 12:35:58 +08:00 ![]() 哈哈,原来 站长已经说过了。我发现,好像没有站内搜索。导致了,经常有重复的提问? |
9 sampeng 2018-07-13 12:37:55 +08:00 ![]() 12345 人和 11111 人在在线统计上没有任何区别 |
![]() | 10 Infernalzero 2018-07-13 13:52:21 +08:00 ![]() 你站站长之前好像说过,他用的 redis 的 dbsize |
![]() | 11 owenliang 2018-07-13 13:58:19 +08:00 via Android ![]() redis 实现,心跳上来以后 pipeline 从前一分钟的集合删除 uid,向当前分钟的集合添加 uid。 在线用户数等于前一分钟集合大小+当前分钟集合大小。 pipeline 记得末尾带一个 expire 命令,另外应该把用户打散到多个集合,避免单个集合过期回收内存时 stop the world. |
12 salamanderMH 2018-07-13 14:54:52 +08:00 @GoPython 你刷个页面看看,都没有 WS 的请求 |
![]() | 13 fancyhan 2018-07-13 15:10:14 +08:00 redis 很容易 |
![]() | 14 GoPython 2018-07-13 17:18:06 +08:00 @salamanderMH 额,好吧。刚才确认了.确实是 |
![]() | 15 KeatingSmith 2018-07-13 17:31:51 +08:00 根据上面的回复,下面是我的猜想: 对于 V 站的每一请求,都会记录 IP 和请求时间。然而,V 站在线状态的判断依据是「是否在十五分钟内有请求。」因此,用户的每一次请求时间都会记录在某个集合中。当然,是要先判断 IP 是否已经存在,如果存在,则只更新请求时间。 这样就明了了,V 站的请求人数,实际上就是计算集合中元素的请求时间距当前时间小于 15 分钟的元素的数量。 |
![]() | 16 KeatingSmith 2018-07-13 17:39:23 +08:00 具体的可以看这里: t/298920 重新总结下,V 站会在每次请求上提取 session,将该 session 设置过期时间( 15 分钟)作为 key 存储,然后通过 dbsize() 获取到在线人数。 |
17 leon19901130 2018-07-13 17:56:45 +08:00 异步心跳可以统计 |
![]() | 20 lhx2008 2018-07-13 19:03:16 +08:00 |
![]() | 21 owenliang 2018-07-13 19:18:00 +08:00 via Android @lhx2008 懒删除就是内存不够才删除,所以直接存在第一层上还好,存在第二层就是大 key 了,真的不好说了。 |
22 Vhc001 2018-07-13 19:34:58 +08:00 越大越好 你们看 V 站下面显示 1800 人在线,实际也就两三百人 |