关于MongoDB ObjectId

本文深入解析MongoDB中ObjectId的生成机制,包括其12字节的构成:时间戳、机器标识符、进程ID及计数器,阐述了ObjectId的递增特性及唯一性保证,并讨论了在不同驱动实现下ObjectId的生成差异。
摘要由CSDN通过智能技术生成

ObjectId的构成

ObjectId的值由12个字节组成,其中,

  • 4个字节表示时间戳(自Unix纪元以来的秒数),记录创建时间;
  • 3个字节表示机器标识符,保证不同主机产生不同的ObjectId值;
  • 2个字节表示进程ID,保证在同一台主机不同MongoDB进程产生不同的ObjectId值;
  • 3个字节表示自增计数器(以随机值开头),保证同一主机同一进程同一秒内产生ObjectId的唯一性。

ObjectId =时间戳(4字节) + 机器标识码(3字节) + 进程ID(2字节) + 计数器(3字节)

ObjectId的构成

ObjectId的值总体上呈递增趋势,但不是绝对的

ObjectId前4个字节存的是时间戳,而时间是递增的,所以ObjectId总体保证递增的顺序。

存储的时间戳只精确到秒,在同一台机器不同的MongoDB进程,同一秒内生成的ObjectId,进程ID小的会排在大的前面。存在这种情况,进程ID大的先生成ObjectId,但还是会排在进程ID小的后面。所以ObjectId递增不是绝对的。

ObjectId在一秒内生成的数量是有限的

3个字节所能表达的最大的整数:2^24-1。所以一个MongoDB进程,在一秒内最多能生成 2^24-1 个ObjectId。

从目前机器的性能来看,要超过这个限制几乎是不可能的。

ObjectId的唯一性

ObjectId近似唯一,理论上会出现很小概率(1/(2^24-1))的重复情况,这取决于MongoDB驱动实现ObjectId方式。

以C#官方驱动来说,构成ObjectId的计数器,C#使用了Interlocked.Increment实现,保证了同一MongoDB进程在同一秒内生成的多个ObjectId的计数器是累加的,从而保证了生成的ObjectId是唯一的。

不过,有些版本的驱动是使用了随机数作为计数器,这种情况下并不能保证生成的ObjectId是唯一的。

所以,除非你使用的是一个非常老的版本,或者很小众的驱动,否则都不需要为重复的ObjectId担心。

 

转载于:https://my.oschina.net/u/2935389/blog/3034525

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值