如何即时的获取到用户的在线状态?回复必谢

2013-05-24 10:20:47 +08:00
 workaholic
如题,一个网站,如何即时的知道用户在线或者离线? session有一定的延迟,频繁刷新用户最后活动时间是一个很大的开销,不知道有没有更好的方案?谢谢
4143 次点击
所在节点    程序员
18 条回复
cxe2v
2013-05-24 10:30:02 +08:00
试着做一个功能专门记录用户在线状态
我只是抛个砖,具体我也没做过,不知道这样开销大不大,响应速度怎么样
zhttty
2013-05-24 10:44:26 +08:00
正常的状况下还是能比较及时获取到用户在线状态的,譬如JS检测浏览器的关闭操作,在关闭前发消息。但是非正常状态譬如断网...
shinwood
2013-05-24 11:06:18 +08:00
Discuz! 用得是 InnoDB 的 session 表,对每个动作进行更新,但开销比较大。
binux
2013-05-24 11:10:38 +08:00
放内存里不就好了
cloudzhou
2013-05-24 11:16:35 +08:00
我给你一个现实的解决方案吧,判断用户时间在线基本是用户的各种点击浏览行为,每次点击都可以更新用户的最近活跃时间,一般以最近10分钟(也可以其他时间)来认为这段时间内的用户是在线的,两种方法:
1)数据库,每个点击都是update用户最近活跃时间,用户是否在线就是看时间是否在范围内,总在线人数就是 count 所有在时间范围内
这种做法对数据库压力非常的大,所以要善用 nosql,第二种解决方法:
2)使用redis Sorted sets,逻辑上是一样的,就是有来了就update,然后定时清空超过一定时间的用户,剩下的这个 redis Sorted sets 就都是在线用户了,只需要判断用户是否在这个set里面就可以了

在现实实践中有很多小技巧,如果人数真的千万级别,那么可以考虑按照一定随机比例来更新状态,存在一定误差,还有对于常驻内存的应用,比如 jvm,可以实现一定的数据结构,先在内部做存储,然后统计到远程数据库或者 nosql,其实这是队列机制的思想。
cloudzhou
2013-05-24 11:24:27 +08:00
第三种更加简单的方法:
使用 memcached,然后按照一定的生存时间段放入 cache,
如果这个用户在cache内,说明是在线的,如果没有那么不在线。
对于用户的每次浏览行为,都是update新的cache,没有的话就新建cache
这种方法有缺点,没办法列出所有在线用户。
tysx
2013-05-24 13:07:12 +08:00
每个用户发起一Ajax,服务器不返回任何东西一直保持连接。这样是最精确的
shiny
2013-05-24 13:11:07 +08:00
试试长连接
saharabear
2013-05-24 13:13:53 +08:00
http不能做到很好地支持准确的在线状态。
chemzqm
2013-05-24 13:18:58 +08:00
nodejs engine.io长连接,开销不大
Mihuwa
2013-05-24 13:54:01 +08:00
谷歌分析有“实时”功能

可以直接看到当前在线数,动作以及其它详细信息。
workaholic
2013-05-24 18:33:08 +08:00
@cloudzhou 恩,我现在的实现方式就是这样,但是还不够即时,正如@saharabear 所说。我现在的程序是当执行入口文件(所有动作都经过这里,bootstrape.php)时就去更新该用户的最近活动时间
saharabear
2013-05-24 18:37:50 +08:00
@workaholic 我试过每5秒让客户端去"ping"一下服务器端,最后发现服务器端用node挺合适,但客户端开销大。用长连接也是一条路子。
workaholic
2013-05-24 18:43:35 +08:00
@saharabear 我在用xmpp做一个在在线客服,需要准确把握客服的在线状态,否则会造成访客获取到了客服但是客服已经离线了的可能。长连接也是有这个问题
atreein
2013-05-24 18:56:52 +08:00
@shinwood Discuz过去用的是Heap(memory)引擎的user_session表
chemhack
2013-05-24 22:22:26 +08:00
@workaholic websocket呗,在服务器监听connect/close事件就行了
saharabear
2013-05-25 00:39:20 +08:00
@workaholic 我正在考虑xmpp做一个在线隐天,这个东西没有js的api处理在线状态?(我还没开始这个需求)
workaholic
2013-05-25 07:40:40 +08:00
@saharabear 有的,Strophe.js

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/69988

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX