Mongodb自动生成的ObjectId可能会重复

BSON ObjectId 占用空间小,可快速生成,可能唯一,可作为document的默认主键。它由12字节组成:

  • 4个字节 时间戳,代表ObjectId生成时间,单位是秒
  • 3个字节 产生ObjectId的机器识别码
  • 2个字节 产生ObjectId的进程id
  • 3个字节 以随机数初始化的一个计数器,java驱动以静态变量的形式共享计数器保证同一进程生成的随机数是递增的

注意:如果一秒内有多个进程生成的ObjectId,那么此时生成的ObjectId并不代表数据插入顺序;由于ObjectId由客户端生成的,所以客户端间的时钟偏移也会导致ObjectId顺序混乱

那么自动生成的ObjectId在什么情况下可能重复呢?

  1. 计数器溢出:同一机器同一客户端在一秒能插入超过16,777,216 (2^24) 的记录
  2. 非递增的随机计数器:一些驱动可能会使用随机数作为计数器,有1 / 16777216的几率重复。
  3. 机器和进程id散列冲突:不同的机器和进程生成了同一个hash

转载于:https://my.oschina.net/killnull/blog/748928

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值