V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
mistergo
V2EX  ›  问与答

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

  •  
  •   mistergo · 2018-05-20 20:51:04 +08:00 · 3100 次点击
    这是一个创建于 2377 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我们公司大概有几千个 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,个位数毫秒级响应
    huiyifyj
        8
    huiyifyj  
       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
    几千个马甲包?发财了啊
    xiaochocking
        15
    xiaochocking  
       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
    估计是网盟或者统计类 为开发者服务的公司...
    LevineChen
        23
    LevineChen  
       2018-05-21 12:18:53 +08:00 via iPhone
    第一条可以用 hyperloglog 大概百分之 0.8 的误差
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1365 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 23:52 · PVG 07:52 · LAX 15:52 · JFK 18:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.