现在的场景是这样的
原表 500w 左右的数据量 现在每 20 分钟会有 2-3w 的增量数据
需求: 根据数据表中的一列(cid) 统计 同一种 cid 出现次数最多的前 20 名
我自己的想法是 后台写一个脚本 定时读取这个表 读入 redis 利用 ZINCRBY 做计数器
key 是这样的: user_top:xxx(对应的 cid) 每读一行 相应的 key 加一 最后统计只需要 zrangebyscore
然后在另一张日志表记录本次读到的 id 下次从这个地方接着读
那么如果 redis 突然挂了或者发生其他原因导致服务不可用 那么即使做了 aof 也无法保证数据能百分百恢复 这样的情况下 该如何解决 , 或者还有别的什么解决方法来进行统计呢?
1
gamexg 2015-12-14 09:45:36 +08:00
>然后在另一张日志表记录本次读到的 id 下次从这个地方接着读
也存到 redis , redis 回档 id 也跟着回档了... 感觉没必要坚持 redis 挂了也能正常工作吧? redis 数据丢了重新统计。 |
2
yuptyy OP @gamexg 问题就是 redis 重启后 不是所有数据都丢 那么重新统计的话 怎么知道哪部分重新统计呢 必然会造成重复读取的情况
|
3
gamexg 2015-12-14 10:06:48 +08:00
除非 redis 有 bug ,不然最多会丢失最后未写入磁盘的数据。
>然后在另一张日志表记录本次读到的 id 下次从这个地方接着读 看你的需求了,如果真的一个都不想重复统计只能每统计一条就将当前已统计的 id 保存到 redis 。下次启动从 redis 读取。这样可以保证在最极端情况下只会重复统计一条。 |
4
flowyi 2015-12-14 10:23:43 +08:00
不用想太多, redis 挂了重新从原表再算一次就好了
redis 很稳定,挂的概率很小。如果担心数据不一致,定期校验就好了。 |
5
iburu 2015-12-14 10:26:41 +08:00
redis+akka
|
6
knightdf 2015-12-14 10:44:53 +08:00
我想说。。。 spark 很适合干这个
|
7
sunjiayao 2015-12-14 12:34:24 +08:00
假设 LZ 的数据增量记入 log 了
这种计数的统计用 storm 更好吧~ |
8
feilaoda 2015-12-14 14:11:45 +08:00
每 20 分钟的话,一个 mysql 就轻松搞定了
|