一种千万级用户实时统计用户数的简单实现
场景:微信小程序注册用户已经接近千万,而且分为实名用户和非实名用户,openId为小程序的用户id,一个实名用户可以有多个微信,所以可以多次注册,但是实名信息为同一个人。
需求:实时显示用户增长量,实名用户量,实名去重用户数,最近七日的用户变化曲线等。
实现:spring aop + redis atomlong + crontab shell脚本
思路:
1、每天凌晨3点执行一次定时任务,从msyql从库读取用户数据,做以上处理,然后获得统计数据作为基准值,写入redis。
2、aop对用户表的update、insert操做进行拦截处理,由于业务场景一般对用户都是逻辑删除,所以不需要去切delete操作。
3、根据update中的实名参数信息判断该次update是不是实名数据更新,通过实时根据身份证去查之前该用户是否已经有其他微信号进行过实名(这里有一次数据库的交互,对身份证号要建索引)。
insert操作肯定是用户的增长,这个很好理解。
4、redis中根据业务key+日期的方式对一周内数据进行缓存,用于页面展示一周用户增长曲线。
5、具体切面的核心代码如下: