统计网站中用户在线时长的方案
在电商网站中有时候需要需要统计用户在公司的网站中在线时长,然后运营人员通过分析用户在网站中浏览的时长的数据做一些业务调整和规划工作,下面我们整理几种统计用户在网站中在线时长的方案。
1、登录登出统计方案
这种方案的实现原理很简单,当用户登录的时候我们保存用户的登录时间信息,然后用户在网站中做一些业务操作,最后用户点击退出按钮退出系统或者关闭浏览器删除session的时候,后端服务通过当前登出时间与用户登录时间相减得到用户在网站中的在线时长,更新这个在线时长数据到数据库中。
此方案中如果用户是异常的退出或者长时间不操作网站等情况下就没有办法统计了。
2、借助Redis的Zset实现方案
本方案的原理是利用redis的 Zse t的score判断用户的在线状态,具体的流程如下所示:
(1)用户登录的时候记录用户的登录信息到数据库中,并且把用户的登录时间记录到redis的 Zse t的score中。
(2)用户操作业务系统的时候更新redis上Zset中score值。
(3)使用定时任务(如xxl-job)批量的扫描redis中 Zset 上score中前5分钟(具体的时间可以根据业务需要来定)没有做任何操作的用户,这批用户我们认为就是下线的用户。然后根据score值计算用户在线时长的数据并将这个数据更新到数据库中,最后要删除这个用户在redis中的key来释放redis的内存。
此方案类似很多中间件中的心跳机制,通过发送这种心跳来确定用户是否在线,如果用户在一定时间中没有操作业务系统,此时就认为用户下线了。
3、基于Redis的过期key的通知方案
本方案是基于Redis过期key的通知方案实现的,具体的实现流程如下所示:
(1)用户登录的时候记录用户的登录信息,然后在Redis中保存用户的信息并添加一个过期时间。
(2)用户在网站中操作相关的业务,然后延长Redis中key的过期时间。
(3)当Redis检测到某个key过期之后会通知业务系统,在业务系统中根据当前的时间减去用户登录时间得到用户的在线时长,最后将用户的在线时长数据更新到数据库中。
本方案是依赖Redis过期通知的,但是在实际中Redis的过期key不会立马删除,因为Redis采用了惰性删除和定期删除的方式来管理过期数据,这样就存在时延,此方案一般不推荐使用。