统计的分类
统计分为新增统计、活跃统计、留存统计
新增统计
首先确认维度
- 按设备号统计
- 按用户账号统计 两者区别在于用户是否登录。
其次,某些应用会把长时间未登录的用户算作新增用户,如果这样也算新增,需要划分时间范围(30天、90天或者半年),如果不划分时间范围就是仅记录真正新增的用户,数据比前者略少,具体看推广的力度。
新增的计算方法为:
- 用户是否新建账号,新建账号必定是新增用户,
- 当前用户是否在指定时间段内登陆过,如果未登陆过,算作新用户,
以上两种情况都会向日志表中插入一条数据,日志表主要记录,用户id、设备号、登陆时间、创建时间、更新时间、删除时间。视乎情况记录用户的手机型号,系统版本和操作系统。- 如果一天中服务器有相对空闲的时间(一般指凌晨),可以选择用脚本在指定时间生成统计数据
- 没有相对空闲的时间,可以选择部署clickhouse,经过实战测试,通过clickhouse查询mysql,上亿甚至十亿级的表关联查询都可以轻松抗住。
活跃统计
活跃数的定义是:只要今天登陆过应用,即算活跃。
用户每日第一次打开应用是即上报一条信息到MQ,MQ消费时查询该用户信息在今日是否上包裹,如果上报过,丢弃这条MQ。
活跃数的统计也分为两种情况
- 统计当天活跃用户
- 统计统计指定日期活跃用户
第一种情况,如果非常要求实时性,可以用服务器的socket连接数来表示即可,
第二种情况也是两套方案
- 获取实时数据,
1.1 通过clickhouse实时查询。
1.2 用服务器的socket连接数表示当前活跃用户数,误差在3%左右(因为存在连接断开尝试重连的情况。)- 获取历史数据,通过定时脚本在空余时间(一般是第二日的零点之后)生成统计数据,存入统计详情表。
留存统计
此处留存以活跃设备举例,留存按照日期,分为昨日留存,3日留存,7日留存,15日留存,30日留存
留存的计算方法是:
- 获取今日活跃的账号;
- 获取昨日活跃的账号;
- 判断前者在后者中的占比;
有几套方案可供选择:
- 使用redis中的set,set有求交集的功能。
- 将第一步和第二步获取的数据存入map中,循环交叉对比。
- 直接使用clickhouse查询(性能极高)。
三者任选其一,个人推荐第三个方案,不加索引都很快。