服务需要生成一个自增 id,正好项目了用到 mogondb,用他的new ObjectId()
来生成 id 就不启其他服务了。
有人使用过这个方法吗,是否会带来性能问题?
![]() | 1 glaucus 2019-07-15 18:29:27 +08:00 via iPhone 我目前就是这样,好像没发现啥性能问题,也有可能是我总能不高 |
![]() | 3 VensonEEE 2019-07-15 18:35:08 +08:00 Snowflake,了解一下 |
![]() | 4 MartinWu 2019-07-15 18:40:24 +08:00 他每一个文档必然有一个 objectid (官方建议),那就不需要显式生成。就更谈不上性能问题了吧。。 |
![]() | 5 rrfeng 2019-07-15 18:56:17 +08:00 via Android MongoDB ObjectID 并不保证自增!它自增是因为有时间戳,你在多线程里同时调用是没有严格顺序的。 可以看下官方文档它的实现。 |
6 honeycomb 2019-07-15 19:00:06 +08:00 via Android objectId 的算法公开的,也可以自己生成,也有现成的库 |
![]() | 7 a719114136 OP @MartinWu 这个 id 不是在 mongo 里用,是给其他服务用 |
![]() | 8 PHPJit 2019-07-15 19:06:57 +08:00 via Android redis 的 inc 也可以啊 |
![]() | 9 PHPJit 2019-07-15 19:07:30 +08:00 via Android incr |
![]() | 10 a719114136 OP @PHPJit inc 要记录上次生成的数,不同表还要分别保存 |
![]() | 11 a719114136 OP @rrfeng 多谢提醒 |
12 lands 2019-07-15 20:06:25 +08:00 redis 有个 Snowflake 的 module |
13 DovaKeen 2019-07-15 20:40:11 +08:00 ObjectId 的时间戳精确到秒,同一秒内生成的两个 ObjectId 好像先后顺序是无法确定的哦 |
![]() | 14 chendy 2019-07-15 20:56:53 +08:00 |
15 junbaor 2019-07-15 20:58:02 +08:00 在公司大规模用过,没出问题,放心玩吧。 |
![]() | 16 SmartKeyerror 2019-07-15 21:08:08 +08:00 via Android 服务号+时间戳+redis.incr,如果有长度限制的话,incr 结果取模即可,小整数的服务号区分服务,线程安全且自增 |
17 junbaor 2019-07-15 21:11:44 +08:00 ![]() 我勒个去,自己测了一把,50 个线程生成 10 万个,有两三百个重复的,楼主慎重。 |
![]() | 18 petelin 2019-07-16 09:18:04 +08:00 via iPhone 美团有篇文章讲怎么生成 还开源了一个 最好机器生成 |
20 FightForFreedom 2019-07-16 10:45:11 +08:00 不是很懂为什么执着于自增 id,是和之前的老数据对接么 |
![]() | 21 a719114136 OP @FightForFreedom 1.自增对数据库建索引有帮助。2.可以用于分页 |
![]() | 22 JCZ2MkKb5S8ZX9pq 2019-07-16 14:29:19 +08:00 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 |
23 liuguang 2019-07-16 15:52:17 +08:00 object id 与时间戳、机器码、进程号、和随机数有关,一般而言,重复的概率极低,即使重复了也无关紧要,做好 unique 索引就不用担心了 |
![]() | 24 jziwenchen 2019-07-16 16:04:04 +08:00 担心重复的话 可以给每一个生成器加一个前缀吗 ... |