请教大家一个计数器的问题,想了 2 周了,目前没有完美的方案 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
mistergo
V2EX    问与答

请教大家一个计数器的问题,想了 2 周了,目前没有完美的方案

  •  a href="Javascript:" Onclick="downVoteTopic(456348);" class="vote">
  •   mistergo 2018-05-20 20:51:04 +08:00 3462 次点击
    这是一个创建于 2705 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我们公司大概有几千个 App,每个 App 在每次在手机上启动时,都会向服务器上报当前设备的 deviceID 和 AppID。目前,服务端这边,有两个需求:

    1. 想要知道任意一个 App,一共有多少台设备安装过;
    2. 对于任意 App,拿到任意 deviceID 后,要快速知道之前有没有安装过。

    目前的几个思路:

    1. 把所有设备 ID 存储到数据库,但是这样数据库行数会非常多,后期查询起来可能会慢。
    2. 如果用 redis 之类的,担心存不下
    3. 如果用 elasticsearch,聚合+统计的操作,也会比较慢

    请教各位大神,有没有其他好方案?

    23 条回复    2018-05-21 12:18:53 +08:00
    woscaizi
        1
    woscaizi  
       2018-05-20 21:15:24 +08:00 via iPhone
    Mysql 就可以吧,数据没到亿级吧。
    Mutoo
        2
    Mutoo  
       2018-05-20 21:37:41 +08:00
    2 用布隆过滤器可解
    a132811
        3
    a132811  
       2018-05-20 22:47:54 +08:00   1
    2. 用 bloomFilter 要考虑错误率容忍问题。错误率不能容忍,就 redis hash。redis 内存占用在你担心前应该压测一下。真是内存不够》加内存或者服务器。要压榨内存,就自己用 mmap 实现 hash: https://www.jianshu.com/p/3fe88953e9f9
    1. 就基于 2 计数就行了
    dapang1221
        4
    dapang1221  
       2018-05-20 23:19:20 +08:00 via iPhone
    splunk,一点也不慢
    glues
        5
    glues  
       2018-05-21 00:00:06 +08:00 via iPhone
    mysql 完全没问题
    jssyxzy
        6
    jssyxzy  
       2018-05-21 03:01:10 +08:00
    1 个 条记录 10 字节的话, 1g 可以存一亿条记录
    一张 hash 表应该够,
    而且觉得一起太多, 可以根据 appid 进行切割
    ctsed
        7
    ctsed  
       2018-05-21 03:29:20 +08:00 via Android
    es 不慢啊,好好改改 mapping,个位数毫秒级响应
    fengyj
        8
    fengyj  
       2018-05-21 08:05:06 +08:00 via Android
    看标题还以为是与数字逻辑电路有关,emm,打扰了。
    murmur
        9
    murmur  
       2018-05-21 08:30:34 +08:00
    只有我好奇开发了几千个 app 连怎么统计都不知道的是什么公司么
    怕不是
    lianyue
        10
    lianyue  
       2018-05-21 08:32:49 +08:00 via iPhone
    所有的数据库都能吧 按照 deviceID 分表,分片就好了
    lianyue
        11
    lianyue  
       2018-05-21 08:35:31 +08:00 via iPhone
    不用 count(*) 大部分数据库 亿级都是 0.0x 大概 很快的
    Tokin
        12
    Tokin  
       2018-05-21 08:37:21 +08:00
    几千个 App....大公司啊,这么多 App。。。
    chenuu
        13
    chenuu  
       2018-05-21 09:28:10 +08:00
    redis.
    lizhenda
        14
    lizhenda  
       2018-05-21 09:33:04 +08:00
    几千个马甲包?发财了啊
    ccceeeooo
        15
    ccceeeooo  
       2018-05-21 09:34:56 +08:00
    几千个 app 不算大公司 算巨公司吧
    yangqi
        16
    yangqi  
       2018-05-21 09:36:26 +08:00   1
    几千个 app, 平均每个 app 下载量多少? 也就是装机量多少?
    doubleflower
        17
    doubleflower  
       2018-05-21 11:01:22 +08:00
    明显是想多了,数据库装不下装机量的公司世界上还没有
    imn1
        18
    imn1  
       2018-05-21 11:30:55 +08:00
    希望不是 XX 马克丁
    rrfeng
        19
    rrfeng  
       2018-05-21 11:39:12 +08:00
    redis:每次存俩值

    incr count:${appid} 1
    set ${appid:deviceid} 1

    总量算一下就知道了。 计数器可以忽略,总安装量你可以算出来。或者不知道的话就先准备 10G 看看。
    10G 存个 2-3 亿没啥问题……只要你 id 不是特别特别长。
    rrfeng
        20
    rrfeng  
       2018-05-21 11:40:16 +08:00
    @rrfeng

    如果连 10G 也没有,就用 bloom filter。
    mistergo
        21
    mistergo  
    OP
       2018-05-21 12:15:02 +08:00
    谢谢大家。
    在问这个问题之前,我们采用的 es,但是 es 的问题是查询起来非常慢,每次大概需要几十秒。因为我们水平有限,效率一直没有优化上去。
    现在我们买了 redis 的 32G 的内存服务器,用 SET 数据类型去存储。SET 类型天然支持数量统计、查询是否存在等功能,满足我们需求,目前来看效果很好,查询速度很快。如果后期空间不够,公司也愿意花钱加内存。
    kchum
        22
    kchum  
       2018-05-21 12:17:40 +08:00
    估计是网盟或者统计类 为开发者服务的公司...
    Enivel
        23
    Enivel  
       2018-05-21 12:18:53 +08:00 via iPhone
    第一条可以用 hyperloglog 大概百分之 0.8 的误差
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5142 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 09:17 PVG 17:17 LAX 02:17 JFK 05:17
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86