推荐工具
› RoboMongo
推荐书目
› 50 Tips and Tricks for MongoDB Developers
Related Blogs
› Snail in a Turtleneck
a719114136
V2EX  ›  MongoDB

借助 mongodb 生成自增 id 是否可行?

  •  
  •   a719114136 · Jul 15, 2019 · 12938 views
    This topic created in 2670 days ago, the information mentioned may be changed or developed.

    服务需要生成一个自增 id,正好项目了用到 mogondb,用他的new ObjectId()来生成 id 就不启其他服务了。

    有人使用过这个方法吗,是否会带来性能问题?

    25 replies  •  2019-07-16 16:13:59 +08:00
    glaucus
    glaucus
    Jul 15, 2019 via iPhone
    1
    我目前就是这样,好像没发现啥性能问题,也有可能是我总能不高
    glaucus
    glaucus
    Jul 15, 2019 via iPhone
    2
    @glaucus 总能-》并发
    VensonEEE
    VensonEEE
    Jul 15, 2019
    3
    Snowflake,了解一下
    MartinWu
    MartinWu
    Jul 15, 2019
    4
    他每一个文档必然有一个 objectid (官方建议),那就不需要显式生成。就更谈不上性能问题了吧。。
    rrfeng
    rrfeng
    Jul 15, 2019 via Android
    5
    MongoDB ObjectID 并不保证自增!它自增是因为有时间戳,你在多线程里同时调用是没有严格顺序的。
    可以看下官方文档它的实现。
    honeycomb
    honeycomb
    Jul 15, 2019 via Android
    6
    objectId 的算法公开的,也可以自己生成,也有现成的库
    a719114136
    a719114136
    OP
    Jul 15, 2019
    7
    @MartinWu 这个 id 不是在 mongo 里用,是给其他服务用
    PHPJit
    PHPJit
    Jul 15, 2019 via Android
    8
    redis 的 inc 也可以啊
    PHPJit
    PHPJit
    Jul 15, 2019 via Android
    9
    incr
    a719114136
    a719114136
    OP
    Jul 15, 2019
    10
    @PHPJit inc 要记录上次生成的数,不同表还要分别保存
    a719114136
    a719114136
    OP
    Jul 15, 2019
    11
    @rrfeng 多谢提醒
    lands
    lands
    Jul 15, 2019
    12
    redis 有个 Snowflake 的 module
    DovaKeen
    DovaKeen
    Jul 15, 2019
    13
    ObjectId 的时间戳精确到秒,同一秒内生成的两个 ObjectId 好像先后顺序是无法确定的哦
    chendy
    chendy
    Jul 15, 2019
    14
    junbaor
    junbaor
    Jul 15, 2019
    15
    在公司大规模用过,没出问题,放心玩吧。
    SmartKeyerror
    SmartKeyerror
    Jul 15, 2019 via Android
    16
    服务号+时间戳+redis.incr,如果有长度限制的话,incr 结果取模即可,小整数的服务号区分服务,线程安全且自增
    junbaor
    junbaor
    Jul 15, 2019❤️1
    17
    我勒个去,自己测了一把,50 个线程生成 10 万个,有两三百个重复的,楼主慎重。
    petelin
    petelin
    Jul 16, 2019 via iPhone
    18
    美团有篇文章讲怎么生成 还开源了一个 最好机器生成
    jifengg
    jifengg
    Jul 16, 2019
    19
    同意 @PHPJit 说的,用单例的 redis 的 incr 来实现,“记录上次的数”,“不同表”都没有问题。
    FightForFreedom
    FightForFreedom
    Jul 16, 2019
    20
    不是很懂为什么执着于自增 id,是和之前的老数据对接么
    a719114136
    a719114136
    OP
    Jul 16, 2019
    21
    @FightForFreedom 1.自增对数据库建索引有帮助。2.可以用于分页
    JCZ2MkKb5S8ZX9pq
    JCZ2MkKb5S8ZX9pq
    Jul 16, 2019
    22
    Before this discussion, recall that the BSON Object ID consists of:

    [4 bytes seconds since epoch, 3 bytes machine hash, 2 bytes process ID, 3 bytes counter]

    https://stackoverflow.com/questions/4677237/possibility-of-duplicate-mongo-objectids-being-generated-in-two-different-colle
    liuguang
    liuguang
    Jul 16, 2019
    23
    object id 与时间戳、机器码、进程号、和随机数有关,一般而言,重复的概率极低,即使重复了也无关紧要,做好 unique 索引就不用担心了
    jziwenchen
    jziwenchen
    Jul 16, 2019
    24
    担心重复的话 可以给每一个生成器加一个前缀吗 ...
    jk1030
    jk1030
    Jul 16, 2019
    25
    @jifengg 单独 incr 不考虑 redis 异常情况? 如果断电是不是还要强制 aof 恢复?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   4206 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 49ms · UTC 09:40 · PVG 17:40 · LAX 01:40 · JFK 04:40
    ♥ Do have faith in what you're doing.