10

我正在开发一个考虑到可扩展性的项目,我已经走到了一个十字路口。在我的网站上,我想检测用户是否在线。我想不出最好的方法来处理这个问题。我的想法是这样的(在伪代码中):

// SQL user table:
user {
  "name": "blah blah",
  "email": "derpy@derpyderp.com",
  "online": false
}

因此,每当用户登录时,我都可以将他的online列更新为true. 然而,这最终会导致每次用户登录时都会发生 SQL 查询,如果发生这种情况,我会说,每秒 10 次登录,那么,就会发生很多查询。我想我可以做同样的事情但在不同的表中的另一种方法:

// Activity table:
activity {
  "user_id": 2,
  "online": true
}

出于某种原因,我相信由于与表的分离,这会导致更少的内存消耗user。但是我不确定它是否会对性能产生任何实际影响。

所以,如果你能用你的洞察力祝福我,我会更加感激,谢谢。

4

3 回答 3

9

一般来说,在用户表中添加一列来存储lastActivity时间是一种常见的做法。每当用户登录或访问页面时,将当前时间存储在该字段中。如果您想知道他们是否在线,请查看最后记录的时间是否在某个窗口内 - 例如五分钟。您可以查询所有行以查看当前有多少用户在线作为结果。

我不会太担心每隔几秒钟运行一次查询——你的服务器可以处理它(假设这些写得很好而且不是很冗长)。

于 2012-05-25T04:25:18.050 回答
0

您可以使用 datetime 作为字段类型,并且不要忘记记录用户 IP,以便您可以跟踪时间

于 2012-05-25T04:45:35.653 回答
0

根据您希望它的工作方式,您基本上有两种选择:

定义一个超时时间,之后您认为用户已注销 使用 ajax/websockets/whatever 来轮询用户

       1: Timeout

这是更简单的用例。每次用户请求页面时,您都会更新数据库中的时间戳。

要了解有多少用户在线,您可以对该数据库进行查询,并对过去 N 分钟内活跃的用户进行 COUNT 操作。

通过这种方式,您将相对准确地了解目前有多少人在积极使用该网站。

      2: Constant polling

由于必须使用 Ajax 更新服务器,因此实现起来有点复杂。否则,它的工作方式与#1 类似。

每当用户在页面上时,您可以保持 websocket 打开或每 N 秒向服务器发出 ajax 请求。

通过这种方式,您可以很好地了解当前有多少人在您的网站上打开了页面,但是如果用户在浏览器中保持页面打开并且不执行任何操作,它仍然会将他们视为在线。

对这个想法的轻微修改是使用客户端上的脚本来监视鼠标移动。如果用户在 10 分钟内没有在您的页面上移动鼠标,您将停止轮询或断开 websocket。这将解决将空闲用户显示为在线的问题。

于 2012-05-25T05:00:40.653 回答