V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yuptyy
V2EX  ›  PHP

增量数据统计 每分钟 2-3w 原数据 500w

  •  1
     
  •   yuptyy · 2015-12-14 09:33:56 +08:00 · 3040 次点击
    这是一个创建于 3050 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在的场景是这样的
    原表 500w 左右的数据量 现在每 20 分钟会有 2-3w 的增量数据

    需求: 根据数据表中的一列(cid) 统计 同一种 cid 出现次数最多的前 20 名

    我自己的想法是 后台写一个脚本 定时读取这个表 读入 redis 利用 ZINCRBY 做计数器
    key 是这样的: user_top:xxx(对应的 cid) 每读一行 相应的 key 加一 最后统计只需要 zrangebyscore

    然后在另一张日志表记录本次读到的 id 下次从这个地方接着读

    那么如果 redis 突然挂了或者发生其他原因导致服务不可用 那么即使做了 aof 也无法保证数据能百分百恢复 这样的情况下 该如何解决 , 或者还有别的什么解决方法来进行统计呢?

    8 条回复    2015-12-14 14:11:45 +08:00
    gamexg
        1
    gamexg  
       2015-12-14 09:45:36 +08:00
    >然后在另一张日志表记录本次读到的 id 下次从这个地方接着读

    也存到 redis , redis 回档 id 也跟着回档了...

    感觉没必要坚持 redis 挂了也能正常工作吧?
    redis 数据丢了重新统计。
    yuptyy
        2
    yuptyy  
    OP
       2015-12-14 09:51:30 +08:00
    @gamexg 问题就是 redis 重启后 不是所有数据都丢 那么重新统计的话 怎么知道哪部分重新统计呢 必然会造成重复读取的情况
    gamexg
        3
    gamexg  
       2015-12-14 10:06:48 +08:00
    除非 redis 有 bug ,不然最多会丢失最后未写入磁盘的数据。

    >然后在另一张日志表记录本次读到的 id 下次从这个地方接着读

    看你的需求了,如果真的一个都不想重复统计只能每统计一条就将当前已统计的 id 保存到 redis 。下次启动从 redis 读取。这样可以保证在最极端情况下只会重复统计一条。
    flowyi
        4
    flowyi  
       2015-12-14 10:23:43 +08:00
    不用想太多, redis 挂了重新从原表再算一次就好了

    redis 很稳定,挂的概率很小。如果担心数据不一致,定期校验就好了。
    iburu
        5
    iburu  
       2015-12-14 10:26:41 +08:00
    redis+akka
    knightdf
        6
    knightdf  
       2015-12-14 10:44:53 +08:00
    我想说。。。 spark 很适合干这个
    sunjiayao
        7
    sunjiayao  
       2015-12-14 12:34:24 +08:00
    假设 LZ 的数据增量记入 log 了
    这种计数的统计用 storm 更好吧~
    feilaoda
        8
    feilaoda  
       2015-12-14 14:11:45 +08:00
    每 20 分钟的话,一个 mysql 就轻松搞定了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2829 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 06:19 · PVG 14:19 · LAX 23:19 · JFK 02:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.