4

我们的目标是建立时间表,说明用户在线的时间段。(我们在谈论什么用户以及他在哪里在线并不重要)要获取有关在线用户的信息,我们可以调用 API 方法 someservice.com/api/?call= whoIsOnline

whoIsOnline方法将为我们提供当前在线的用户列表。但是没有 API 方法可以获取有关谁不在线的信息

因此,我们应该使用从whoIsOnline获得的信息来构建我们的时间线。当然会有测量误差(我们无法实时跟踪信息)。假设我们将每 2 分钟调用一次 whoIsOnline方法(是的,我们将每 2 分钟通过 cron 运行我们的脚本)。

例如,在 08:00 调用whoIsOnline将返回

Peter_id
Michal_id
Andy_id

在 08:02调用whoIsOnline将返回

Michael_id
Andy_id
George_id

如您所见,Peter 下线了,但我们有新的在线用户——George。

可用的工具是Db(MySQL) / 文本文件 / 键值存储 (Redis/memcache);随意选择其中任何一个(甚至全部)。

所以,我们必须得到这样的信息

George_id was online...
12 May: 08:02-08:30, 12:40-12:46, 20:14-22:36 
11 May: 09:10-12:30, 21:45-23:00
10 May: was not online

现在问...

  1. 您将如何存储信息以实施此类时间表?
  2. 您将如何查询/计算有关用户在线时间段的信息?

附加信息..

  1. 您不能更新有关离线用户的信息,只能更新“当前”在线的用户。
  2. 解决方案应该是灵活的:时间线信息可以表示为与任何时区相关。
  3. 我们应该只保留最近 7 天的信息。
  4. 每个在线看到的用户都会自动在我们的数据库中获取自己的标识符。
4

2 回答 2

1

衡量“在线”状态有两种不同的方法:

  1. 假设当有人点击一个页面时,他们在此之后的某个名义时间间隔内在线,例如 5 分钟。因此,如果他们点击 4:03、4:05 和 4:09 的页面,他们将有 4:03 到 4:09-4:14 的在线时间间隔(取决于您对最终点击所做的算法/假设); 或者

  2. 使用“心跳”Javascript 和/或 Flash 进程来跟踪页面打开的频率。

(1) 比较常见。(2) 经常让人们对隐私问题持怀疑态度。另一种看法是(1)是被动监控,而(2)是主动监控。

(1) 有很多变体。间隔可能不是固定的。它可能会因用户所在的页面而异。这可以通过假设或统计抽样,甚至只是概率模型来构建。在最简单的情况下“谁在线?” 只是在过去 5 分钟(例如)内点击过某些内容的用户列表,这很容易计算出来(因为您正在记录每个页面视图)。

于 2010-04-18T14:07:32.830 回答
0

我会做这样的事情(伪代码)

UPDATE session_log SET last_online = NOW() WHERE user = ... AND last_online = '10 minutes ago'
IF NOT UPDATED:
    INSERT INTO session_log (last_online, user) VALUES(NOW(), user)

当然也应该有一个created at(或类似的)专栏,但这样您就可以轻松地跟踪会话。

于 2010-04-18T14:08:43.380 回答