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

2019-07-15 18:23:29 +08:00
 a719114136

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

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

11707 次点击
所在节点    MongoDB
25 条回复
glaucus
2019-07-15 18:29:27 +08:00
我目前就是这样,好像没发现啥性能问题,也有可能是我总能不高
glaucus
2019-07-15 18:30:14 +08:00
@glaucus 总能-》并发
VensonEEE
2019-07-15 18:35:08 +08:00
Snowflake,了解一下
MartinWu
2019-07-15 18:40:24 +08:00
他每一个文档必然有一个 objectid (官方建议),那就不需要显式生成。就更谈不上性能问题了吧。。
rrfeng
2019-07-15 18:56:17 +08:00
MongoDB ObjectID 并不保证自增!它自增是因为有时间戳,你在多线程里同时调用是没有严格顺序的。
可以看下官方文档它的实现。
honeycomb
2019-07-15 19:00:06 +08:00
objectId 的算法公开的,也可以自己生成,也有现成的库
a719114136
2019-07-15 19:06:45 +08:00
@MartinWu 这个 id 不是在 mongo 里用,是给其他服务用
PHPJit
2019-07-15 19:06:57 +08:00
redis 的 inc 也可以啊
PHPJit
2019-07-15 19:07:30 +08:00
incr
a719114136
2019-07-15 19:12:44 +08:00
@PHPJit inc 要记录上次生成的数,不同表还要分别保存
a719114136
2019-07-15 19:13:43 +08:00
@rrfeng 多谢提醒
lands
2019-07-15 20:06:25 +08:00
redis 有个 Snowflake 的 module
DovaKeen
2019-07-15 20:40:11 +08:00
ObjectId 的时间戳精确到秒,同一秒内生成的两个 ObjectId 好像先后顺序是无法确定的哦
chendy
2019-07-15 20:56:53 +08:00
junbaor
2019-07-15 20:58:02 +08:00
在公司大规模用过,没出问题,放心玩吧。
SmartKeyerror
2019-07-15 21:08:08 +08:00
服务号+时间戳+redis.incr,如果有长度限制的话,incr 结果取模即可,小整数的服务号区分服务,线程安全且自增
junbaor
2019-07-15 21:11:44 +08:00
我勒个去,自己测了一把,50 个线程生成 10 万个,有两三百个重复的,楼主慎重。
petelin
2019-07-16 09:18:04 +08:00
美团有篇文章讲怎么生成 还开源了一个 最好机器生成
jifengg
2019-07-16 10:32:13 +08:00
同意 @PHPJit 说的,用单例的 redis 的 incr 来实现,“记录上次的数”,“不同表”都没有问题。
FightForFreedom
2019-07-16 10:45:11 +08:00
不是很懂为什么执着于自增 id,是和之前的老数据对接么

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/583184

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX