• 关于吃掉物理的二次聚合无法实现的需要之旁门左道实现法


    需求:
    吃掉物理想要统计一下,在指定时间内,所有的吃掉物理用户(包括老师,学生,家长等),按访问次数进行一下聚合,显示每个访问次数对应的人数,可以进一步获知僵尸用户和活跃用户的个数,以后可能扩展为想知道具体是哪些人。要的报表如下:


    2018-06-01至2018-09-01 (其中天表示这个用户共使用了多少天,一天使用N次记一天)


    100天 56人
    98天 467人
    96天 3442人
    ...

    1天 29034人

    =======================================================================================================
    分析与实现:

    1、因es无法实现二次聚合(或者说我们不会),现在能想到的方法是不完全依赖于ES,要使用原来的技术体系与ES结合的思路实现。

    2、设计一个统计任务的概念,就是说选择一段时间后,点开始统计,就分配一个统计任务(时间戳即可 chidiaowuli_20180809082230),记录到mysql中,界面上显示,现在后台统计中,请稍侯...

    3、lua将任务ID,时间戳+2018_06_01-2018_09_01 写入到一个ssdb的queue中,名称为tongjifenxi_queue

    4、开发一个python程序一直while true进行循环,监控到有内容,就准备开始进行统计分析,发现前缀是吃掉物理就开始吃掉物理的逻辑,后期可以扩展为支持其它业务。
    如果没有找到就休息3秒。

    5、将吃掉物理的用户在这段时间内访问的人员,按老师,学生,家长查三次,分别按分页读取,一次100个。这样就比直接从数据库中查询所有的吃掉物理用户优化多了,因为没访问的直接就不再统计了!

    6、将100个用户,调用elasticsearch进行统计这些人在2018_06_01-2018_09_01时间范围内的访问天数。

    7、获取访问天数后,将结果记录到ssdb,具体设计如下:

    (1)hash记录真实情况

    hashmap 名称 : chidiaowuli_acess_count_时间戳_98
    key: identity_id+'_'+person_id
    value: 1

    (2) 需要知道哪些hashmap是这次相关的
    zset name: chidiaowuli_acess_count_zset_时间戳
    key : chidiaowuli_acess_count_时间戳_98
    score: 每次增加一个人员访问天数时,需要首先增加hashmap的内容,然后取出 zset中相关的score并加1.

    8、显示需求要的列表:直接从zset中读取即可。如果想要钻取,我们可以读取对应的hashmap.

    9、垃圾回收与清理
    对于以前的统计分析任务,可以删除,删除时要按mysql-->ssdb zset --> ssdb hashmap的方式找到最后的记录,删除之,然后再回退删除上一级,最终删除mysql数据。

    10、至此,所有流程完成。

  • 相关阅读:
    浅析NetFilter和iptables
    关于skb_header_pointer函数
    Linux kernel 绝对路径之d_path篇
    几个内核函数:filp_open、filp_read、IS_ERR、ERR_PTR、PTR_ERR
    一文读懂数字签名
    Nginx配置文件nginx.conf中文详解(总结)
    nginx 重写 rewrite 基础及实例
    最完美解决Nginx部署ThinkPHP项目的办法
    nginx中的try_files指令解释
    js电话号码正则校验--座机和手机号
  • 原文地址:https://www.cnblogs.com/littlehb/p/9440689.html
Copyright © 2020-2023  润新知