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

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

  •  
  •   mistergo · 276 天前 · 1978 次点击
    这是一个创建于 276 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    目前的几个思路:

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

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

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

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

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

    如果连 10G 也没有,就用 bloom filter。
        21
    mistergo   275 天前
    谢谢大家。
    在问这个问题之前,我们采用的 es,但是 es 的问题是查询起来非常慢,每次大概需要几十秒。因为我们水平有限,效率一直没有优化上去。
    现在我们买了 redis 的 32G 的内存服务器,用 SET 数据类型去存储。SET 类型天然支持数量统计、查询是否存在等功能,满足我们需求,目前来看效果很好,查询速度很快。如果后期空间不够,公司也愿意花钱加内存。
        22
    kchum   275 天前
    估计是网盟或者统计类 为开发者服务的公司...
        23
    LevineChen   275 天前 via iPhone
    第一条可以用 hyperloglog 大概百分之 0.8 的误差
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3994 人在线   最高记录 4385   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 17ms · UTC 01:46 · PVG 09:46 · LAX 17:46 · JFK 20:46
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1