mistergo
V2EX  ›  问与答

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

  •  
  •   mistergo · May 20, 2018 · 4264 views
    This topic created in 3098 days ago, the information mentioned may be changed or developed.

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

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

    目前的几个思路:

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

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

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

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

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

    如果连 10G 也没有,就用 bloom filter。
    mistergo
    mistergo
    OP
    May 21, 2018
    21
    谢谢大家。
    在问这个问题之前,我们采用的 es,但是 es 的问题是查询起来非常慢,每次大概需要几十秒。因为我们水平有限,效率一直没有优化上去。
    现在我们买了 redis 的 32G 的内存服务器,用 SET 数据类型去存储。SET 类型天然支持数量统计、查询是否存在等功能,满足我们需求,目前来看效果很好,查询速度很快。如果后期空间不够,公司也愿意花钱加内存。
    kchum
    kchum
    May 21, 2018
    22
    估计是网盟或者统计类 为开发者服务的公司...
    Enivel
    Enivel
    PRO
    May 21, 2018 via iPhone
    23
    第一条可以用 hyperloglog 大概百分之 0.8 的误差
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   948 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 78ms · UTC 19:50 · PVG 03:50 · LAX 11:50 · JFK 14:50
    ♥ Do have faith in what you're doing.