我正在开发一个具有可扩展性的我的项目,我已经走到了一个十字路口。在我的网站上,我想检测用户是否在线。我无法想到处理这个问题的最佳方法。我想的方式就是沿着这些方向(在伪代码中):
// 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
表的分离,这将导致更少的内存消耗。但是我不确定它是否会对性能产生实际影响。
所以,如果你能用你的见解祝福我,我会更感激,谢谢你。
答案 0 :(得分:9)
一般来说,通常会在users表中添加一列来存储lastActivity
时间。用户每次登录或访问页面时,都会将当前时间存储在该字段中。如果您想知道他们是否在线,请查看上次录制的时间是否在特定窗口内 - 例如,五分钟。您可以查询所有行,以查看当前有多少用户在线。
我不会太担心每隔几秒就会运行一次查询 - 你的服务器可以处理它(假设它们编写得很好而且不是很冗长)。
答案 1 :(得分:0)
您可以将日期时间用于字段类型,不要忘记记录用户IP,以便跟踪时间o
答案 2 :(得分:0)
根据您的工作方式,您基本上有两种选择:
定义超时后您考虑用户注销 使用ajax / websockets / whatever来轮询用户
1: Timeout
这是一个更简单的用例。每次用户请求页面时,都会更新数据库中的时间戳。
要了解有多少用户在线,您可以对此数据库进行查询,并执行在最近N分钟内处于活动状态的COUNT个用户。
通过这种方式,您可以相对准确地了解目前有多少人正在使用该网站。
2: Constant polling
由于必须使用Ajax更新服务器,因此实现起来有点复杂。否则它的工作方式与#1类似。
每当用户在页面上时,您可以保持websocket打开或每隔N秒向服务器执行ajax请求。
通过这种方式,您可以很好地了解当前有多少人在您的网站上打开了网页,但是如果用户在浏览器中打开网页并且没有执行任何操作,则仍会将其视为在线
对该想法的略微修改是在客户端上使用脚本来监视鼠标移动。如果用户没有在页面上移动鼠标10分钟,则会停止轮询或断开websocket。这将解决显示闲置用户在线的问题。