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

2015-12-14 09:33:56 +08:00
 yuptyy

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

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

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

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

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

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

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

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

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

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

redis 很稳定,挂的概率很小。如果担心数据不一致,定期校验就好了。
iburu
2015-12-14 10:26:41 +08:00
redis+akka
knightdf
2015-12-14 10:44:53 +08:00
我想说。。。 spark 很适合干这个
sunjiayao
2015-12-14 12:34:24 +08:00
假设 LZ 的数据增量记入 log 了
这种计数的统计用 storm 更好吧~
feilaoda
2015-12-14 14:11:45 +08:00
每 20 分钟的话,一个 mysql 就轻松搞定了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/243336

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX