MongoDB 使用 ObjectId 代替时间
An ObjectId is a 12-byte unique identifier consisting of:
- a 4-byte value representing the seconds since the Unix epoch,
- a 3-byte machine identifier,
- a 2-byte process id, and
- a 3-byte counter, starting with a random value.
由于前 4 个 byte 表示时间,所以 ObjectId 可以反映时间。默认情况下,前 4 个 byte 表示的时间为文件创建时服务器的时间。
如果你使用 ObjectId 代替时间,那么导入过去存在的数据时 ObjectId 可能发生冲突[1]。
针对同一时刻创建 ObjectId
根据过去的某一时刻创建 ObjectId 会重复,因为前 3 种 byte 都一样,只有最后 3 个 byte 不一样。
对于 PyMongo Driver:
from bson import ObjectId
# timestamp
str(ObjectId())[:8]
'5b2b0778'
str(ObjectId())[:8]
'5b2b0779'
# machine id 和 process id
str(ObjectId())[8:18]
'0e118bd5c7'
str(ObjectId())[8:18]
'0e118bd5c7'
# counter
str(ObjectId())[18:]
'a5b135'
str(ObjectId())[18:]
'a5b136'
假如针对 timestamp 5b2b0778 生成订单,由于是同一机器、进程,所以前 3 种 byte 都相同。而最后的 counter 是在进程启动时初始化一个随机值,然后进行递增。任意两个 ObjectId 相同的概率为 1677 万分之一:
# 3 byte 为 24 位
2 ** 24 / 10000
1677
但随着订单的增多,冲突的概率会越来越大。
所以不能采用针对某一时刻创建 ObjectId 的方法。
分散创建
设定一个时间区间,然后将文件分散到每一秒创建。如果时间区间足够大,那么效果就和正常创建 ObjectId 一样。时间区间可以根据理想冲突率和文件数倒推出来。
参考
MongoDB 使用 ObjectId 代替时间的更多相关文章
- MongoDB中ObjectId的误区,以及引起的一系列问题
近期对两个应用进行改造,在上线过程中出现一系列问题(其中一部分是由于ObjectId误区导致的) 先来了解下ObjectId: TimeStamp 前 4位是一个unix的时间戳,是一个int类别,我 ...
- 从MongoDB的ObjectId中获取时间信息
MongoDB默认使用_id字段作为主键,类型为ObjectId.ObjectId的生成有一定的规则,详情可以查看这篇文章 - MongoDB深究之ObjectId.如果你在写入数据库的时候忘记写入创 ...
- 线上mongodb 数据库用户到期时间修改的操作记录
登陆版权数据库,显示"此用户已到期",数据库使用的是mongodb,顾 需要将此用户的到期时间延长. 解决过程: 1)到网站对应tomcat配置里找出等里mongodb的信息(mo ...
- [MongoDB]MongoDB的ObjectId组成
一.ObjectId的组成首先通过终端命令行,向mongodb的collection中插入一条不带“_id”的记录.然后,通过查询刚插入的数据,发现自动生成了一个objectId“5e4fa350b6 ...
- MongoDB的ObjectId和基本操作增删改查(3)
ObjectId 基本操作增删改查 增: insert 介绍: mongodb存储的是文档,. 文档是json格式的对象. 语法: db.collectionName.insert(document) ...
- 用nodejs删除mongodb中ObjectId类型数据
mongodb中"_id"下面有个ObjectId类型的数据,想通过这个数据把整个对像删除,费了半天劲终于搞定费话少说上代码 module.exports = function ( ...
- mongoDB _id:ObjectId("xxxx")详解
http://blog.haohtml.com/archives/10678 MongoDB ObjectId的优化
- mvc使用mongodb时objectId序列化与反序列化
前面有写使用自己的mvc 序列化工具即jsonNetResult.我这里结合之前写的jsonNetResult来做一个Json序列化工具,而且序列化ObjectId成一个字符串.详细代码例如以下 us ...
- mongodb的ObjectId最后三个字节有趣的地方
ObjectId 由12个字节组成,其中组成如下: a 4-byte timestamp value, representing the ObjectId's creation, measured i ...
随机推荐
- Message: 'geckodriver' executable needs to be in PATH. 解决方法
问题描述: 执行如下代码 # coding=utf-8 from selenium import webdriver driver = webdriver.Firefox() driver.maxim ...
- python保存爬取的图片
用爬虫抓取图片的保存 保存图片 request=urllib2.Request(randNumberUrl,data,headers) picture=opener.open(request).rea ...
- cocos2dx场景切换的坑
有一个类可以使用不同的数据源,每个数据源对应一个对象. 我在类里保存了对象的实例,由于要在其它地方使用所以做成了静态,并在每次初始化时 重新设置,析构时删除. 现在我打开了A,切换到B,结果这个静态的 ...
- 实现itoa()
上代码之前先讲个笑话:曾经有位面试官问:“你实现过 唉踢哦诶(音) 吗”? 我第一个想到的是各种OA系统,心想那玩意不多是Java实现的吗...过一会想明白了,瞬间石化... #include < ...
- saveFileDialog对话框
private void button1_Click(object sender, EventArgs e) { saveFileDialog1.Filter = "*.txt|*.txt| ...
- linux 串口 特殊字符
近日在写一个linux的串口程序,发现大多数情况下数据接收没问题,但是有时却有问题.主要是接收的字符串中包含有0x03这个字符,会造成与它相邻的字符同时也接收不到,搞了好久才发现这个错误.查找资料后发 ...
- JDK1.8与spring3.x的不兼容
今天运气很好,两次遇到了这个兼容性问题,spring3.x不支持 java 1.8 byte code format!! 九月 10, 2017 7:17:18 上午 org.apache.catal ...
- [转]SOA接口的两种常用实现比较:SOAP vs REST
原文链接:http://blog.csdn.net/zhaohuabing/article/details/39643127 SOA架构用于异构系统的协作,因此需要一种跨操作系统.跨语言的通用的消息交 ...
- mysql 存储过程调用
CALL 存储过程名('参数值1',‘参数值2',’参数值3')
- Lua中的常用语句结构以及函数
1.Lua中的常用语句结构介绍 --if 语句结构,如下实例: gTable = {} ] ] then ]) == gTable[] then ]) else print("unkown ...