首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

分布式系统中生成全局ID的总结与思考

大家都知道mysql的自增id,但是不一定知道其实可以设置自增id的初始值以及自增步长, Flicker中的示例中,两个mysql(ticketserver)初始值分别是1和2,自增步长都是2(而不是默认值...,会产生新的记录,而新记录的id是自增的(则增步长为2) Flicker的解决办法通俗易懂,但还是没有解决id信息过少的问题,而且还是依赖单独的一组服务(mysql)来生成全局id。...objectid有12个字节,包含时间信息(4字节、秒为单位)、机器标识(3字节)、进程id(2字节)、计数器(3字节,初始值随机)。...其中,时间位精度(秒或者毫秒)与序列位数,二者决定了单位时间内,对于同一个进程最多可产生多少唯一的ObjectId,在MongoDB中,那每秒就是2^24(16777216)。...那么小文件与block的映射关系在哪里维护呢?要知道小文件的量是很大的 TFS的文件名由块号和文件号通过某种对应关系组成,最大长度为18字节。

1.9K80

.NETCore中实现ObjectId反解

前言 在设计数据库的时候,我们通常需要给业务数据表分配主键,很多时候,为了省事,我都是直接使用 GUID/UUID 的方式,但是在 MonggoDB 中,其内部实现了 ObjectId(以下统称为Oid...ObjectId 的数据结构 首先,我们来看 Oid 的数据结构的设计。 ? 从上图可以看出,Oid 的数据结构主要由四个部分组成,分别是:Unix时间戳、机器名称、进程编号、自增编号。...Oid 实际上是总长度为12个字节24的字符串,易记口诀为:4323,时间4字节,机器名3字节,进程编号2字节,自增编号3字节。...2、机器名称:记录当前生产Oid的设备号 3、进程编号:当前运行Oid程序的编号 4、自增编号:在当前秒内,每次调用都将自动增长(已实现线程安全) 根据算法可知,当前一秒内产生的最大 id 数量为 2^...通过解包可以看出,上图两个红框内的值是一致的,解包成功!

61010
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    MongoDB ObjectId详解及使用ObjectId构成ObjectId获取时间根据时间构造ObjectIdQ&A

    MongoDB中我们经常会接触到一个自动生成的字段:”_id”,类型为ObjectId。 本文详解ObjectId的构成和使用。...按照字节顺序,一次代表: 4字节:UNIX时间戳 3字节:表示运行MongoDB的机器 2字节:表示生成此_id的进程 3字节:由一个随机数开始的计数器生成的值 ObjectId获取时间 从ObjectId...= a + new Array(17).join("0") 50c758800000000000000000// 使用24个字符串构造ObjectId > b = new ObjectId(a)...17个元素正好有16个间隔,所以最终拼接起来的字符串为16个。 根据ObjectId按照插入时间排序 MongoDB默认在ObjectId上建立索引,是按照插入时间排序的。...在有日期范围的情况下,实际上可以从_id中利用IXSCAN找到相应的记录,而不需要根据另外一个时间字段来查询。如果时间字段正好没有索引的话,_id的优势就体现出来了。

    3.9K40

    mongo常用字段类型

    例如,JSON没有日期类型,JSON只有一种数字类型,无法区分浮点数和整数,更别说区分32为和64位数字了。再者,JSON无法表示其他一些通用类型,如正则表达式或函数。...每个数据类型对应一个数字,在MongoDB中可以使用$type操作符查看相应的文档的BSON类型 MongoDB无须声明数据类型,全自动匹配 每种BSON类型都具有整数和字符串标识符,如下表所示: Type...#"78b159" 代指随机数,这里要注意的是,随机数的数字可能会出现重复,不是唯一的 #以上四种标识符拼凑成世界上唯一的ObjectID #只要是支持MongoDB的语言,都会有一个或多个方法,对ObjectID...进行转换 #可以得到以上四种信息 #注意:这个类型是不可以被JSON序列化的 这是MongoDB生成的类似关系型DB表主键的唯一key,具体由24个bit组成: 0-8字节是unix时间戳, 9-14...4、判断某字段类型/长度 // 字段类型为2(string),表示有此字段,或者用: $exists: true ,长度大于100 mongos> db.testnum01.find({calc: {

    7.1K30

    【翻译】MongoDB指南引言

    _id字段 在MongoDB中,文档需要_id字段作为主键,如果插入文档时没有指定_id字段,MongoDB会使用ObjectIds 作为默认的_id的默认值。...binary subtype 值取值范围为0-7 或 128-135     字节数组的长度是:0,1,2,3,4,5,6,7,8,10,12,14,16,20,24或32....最后三个字节表示以随机数开始的计数。 在MongoDB中,集合中的文档需要一个作为主键的唯一_id字段,如果没有指定_id字段,MongoDB默认将ObjectId类型值作为_id字段值。...MongoDB 客户端应该添加一个值为ObjectId的_id字段,使用值为ObjectId的_id字段有如下好处: 在mongo shell中,你可以使用ObjectId.getTimestamp()...OID Strict Mode mongo Shell Mode { "$oid": "" } ObjectId( "" ) 是一个24字符的十六进制字符串。

    4.3K60

    SpringBoot中MongoDB的那些骚操作

    下面是监听器的一些基本用法:设置主键值MongoDB在插入时,如果没有指定_id字段的值,那么MongoDB会自动生成一个ObjectId类型的值作为_id 字段值,但是默认生成的是String类型。...方法,我并没有找到任何的方法。...>> restrictedTypes) {}主键在MongoDB中,主键字段名是固定的_id,默认情况下,如果在插入时,没有指定主键字段的值,那么MongoDB会自动生成一个ObjectId类型的值作为...自定义_id转换器这是一个坑,假如User这个Collection中,使用userId作为_id 字段的值,这是一个字符串。...会使用ObjectId对象作为_id 的值,但是因为MongoDB中_id 字段的类型是普通的字符串,并非是ObjectId,所以就会出现查询不到的情况。

    35710

    SpringBoot中MongoDB的那些高级用法

    下面是监听器的一些基本用法:设置主键值MongoDB在插入时,如果没有指定_id字段的值,那么MongoDB会自动生成一个ObjectId类型的值作为_id 字段值,但是默认生成的是String类型。...方法,我并没有找到任何的方法。...>> restrictedTypes) {}主键在MongoDB中,主键字段名是固定的_id,默认情况下,如果在插入时,没有指定主键字段的值,那么MongoDB会自动生成一个ObjectId类型的值作为...自定义_id转换器这是一个坑,假如User这个Collection中,使用userId作为_id 字段的值,这是一个字符串。...会使用ObjectId对象作为_id 的值,但是因为MongoDB中_id 字段的类型是普通的字符串,并非是ObjectId,所以就会出现查询不到的情况。

    11910

    最佳实践| 一文读懂《MongoDB 使用规范及最佳实践》原理

    我们本次分享为大部分内容的前提是小于等于 4.2 版本,主要原因在于 4.4 及其以上的 MongoDB 版本其实有很多企业里面都没有使用。...key 的字段,但依然建议不要轻易调整 key 的值或 key 的字段构成 ,而是建议在初始化分片 key 的时候就评估好。...(可能有些不是 100% 的准确) 关于 MongoDB ObjectId 在插入一个文档时如果业务没有显示指定 _id 那么 MongoDB 会为每个文档生成一个ObjectId 类型的 _id...,在 2^24-1 个值内都是唯一性 _id 存在意义:解决分布式场景下唯一性标志问题;复制依赖 _id 方便定位修改的记录 ObjectId 用例: shell 下获取 _id 的时间戳方式   _...普通唯一性索引只能在单分片中起到唯一性约束的作用,跨分片无法做唯一性检查或者说实现代价太大。 如何理解 MongoDB 中_id 值不采用严格自增 ID 的方式生成?

    2.4K50

    JSON Patch

    1.前言 可以这么说的是,任何一种非强制性约束同时也没有“标杆”工具支持的开发风格或协议(仅靠文档是远远不够的),最终的实现上都会被程序员冠上“务实”的名头,而不管成型了多少个版本,与最初的设计有什么区别...对于没有 Body 的 PUT 动作,请将 Content-Length 设置为 0 是 否 DELETE 用于删除资源 是 否 PATCH 用于使用部分 JSON 数据更新资源信息(在一个请求里可搭载多个动作...,op代表操作类型,from和path代表目标 json 的层级路径,value代表操作值。...MongoDB 客户端推荐注册为单例。...笔者也写了一个获取信息的接口/api/Persons,返回值如下: [ { "name": "LeBron James", "oId": "5af995a5b8ea8500018d54b7

    1.4K60

    MongoDB 入门极简教程

    数据类型 MongoDB 支持如下数据类型: String:字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。 Integer:整型数值。用于存储数值。...记录文档修改或添加的具体时间。 Object:用于内嵌文档。 Null:用于创建空值。 Symbol:符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。...如果数据库中不存在该集合,那么 MongoDB 会创建该集合,并向其中插入文档。 在插入的文档中,如果我们没有指定 _id 参数,那么 MongoDB 会自动为文档指定一个唯一的 ID。...没有索引,MongoDB 就必须扫描集合中的所有文档,才能找到匹配查询语句的文档。这种扫描毫无效率可言,需要处理大量的数据。 索引是一种特殊的数据结构,将一小块数据集保存为容易遍历的形式。...default_language 字符串 对文本索引而言,用于确定停止词列表,以及词干分析器(stemmer)与断词器(tokenizer)的规则。默认值为 english。

    3.7K10

    听说MongoDB你很豪横?-------------MongoDB数据库基础详解

    4)物联网场景,使用MongoDB存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多 维度的分析。 5)视频直播,使用MongoDB存储用户信息、点赞互动信息等。...MongoDB中的记录是一个文档, 它是一个由字段和值对(field:value) 组成的数据结构。MongoDB文档类似于 JSON对象,即一个文档认为就是一个对象。...不能是空字符串(")。 . 不得含有’ (空格)、、$、1、\和h0 (空字符)。 应全部小写。 最多64字节。...#查看当前正在使用的数据库命令 MongoDB中默认的数据库为test,如果你没有选择数据库,集合将存放在test数据库中。...3)插入当前日期使用new Date() 4)插入的数据没有指定. _id,会自动生成主键值 5)如果某字段没值,可以赋值为null,或不写该字段。 执行后,如下,说明插入一个数据成功了。

    1.1K30

    JSON Patch

    1.前言 可以这么说的是,任何一种非强制性约束同时也没有“标杆”工具支持的开发风格或协议(仅靠文档是远远不够的),最终的实现上都会被程序员冠上“务实”的名头,而不管成型了多少个版本,与最初的设计有什么区别...对于没有 Body 的 PUT 动作,请将 Content-Length 设置为 0 是 否 DELETE 用于删除资源 是 否 PATCH 用于使用部分 JSON 数据更新资源信息(在一个请求里可搭载多个动作...,op代表操作类型,from和path代表目标 json 的层级路径,value代表操作值。...MongoDB 客户端推荐注册为单例。...笔者也写了一个获取信息的接口/api/Persons,返回值如下: [ { "name": "LeBron James", "oId": "5af995a5b8ea8500018d54b7

    2K10

    MongoDB(5)- Document 文档相关

    ,或者在传输过程中不能占用过多带宽 为了超过最大大小限制的文档,MongoDB 也提供了 GridFS(后续再讲) 文档字段顺序 默认情况下,MongoDB 在写操作后保留文档字段的顺序,但以下情况除外..._id 字段永远都是第一个字段 重命名字段名的更新可能会导致文档中字段的重新排序 _id 字段 在 MongoDB 中,存储在集合中的每个文档都需要一个唯一的 _id 字段作为主键 如果新插入的文档没有指定..._id 字段,那么 MongoDB 会自动为它生成一个 ObjectID(上面的截图其实也能看到) 第二条同样适用通过 upsert:true 的更新操作(后续再讲) 存储 _id 值的常用选项 使用...ObjectId 使用自然唯一标识符(如果可用),这样可以节省空间并避免额外的索引 生成一个自动递增的数字 在应用程序代码中生成 UUID,为了更有效地存储集合和索引中的UUID值,将 UUID 存储为...BSON BinData类型的值 如果满足以下条件,则 BinData 类型的索引键将更有效地存储在索引中: 二进制子类型值在0-7或128-135之间,并且 字节数组的长度为:0、1、2、3、4、

    1.4K20

    MongoDB基础之BSON数据类型

    已过时 未定义类型 ObjectId 7 objectId 对象id类型 Boolean 8 bool 布尔类型 Date 9 date 日期类型 Null 10 null 用于表示空值或者不存在的字段...值的集合或者列表可以表示成数组。 { “x” : [“a”, “b”, “c”]} 4、Binary data(二进制数据) 二进制数据可以由任意字节的串组成。不过shell中无法使用。...{ “x” : unddefined } 6、ObjectId ObjectId使用12字节的存储空间,每个字节两位十六进制数字,是一个24位的字符串。...日期在数据中是以标准纪元开水的毫秒数的形式存储的,没有与之相关的时区信息。 9、Null null用于表示空值或者不存在的字段。...shell中没有这个类型。 16、Min key(最小值) BSON包括一个特殊类型,表示可能的最小值。shell中没有这个类型。

    9.4K30

    MongoDB基础之BSON数据类型

    已过时 未定义类型 ObjectId 7 objectId 对象id类型 Boolean 8 bool 布尔类型 Date 9 date 日期类型 Null 10 null 用于表示空值或者不存在的字段...值的集合或者列表可以表示成数组。 { “x” : [“a”, “b”, “c”]} 4、Binary data(二进制数据) 二进制数据可以由任意字节的串组成。不过shell中无法使用。...{ “x” : unddefined } 6、ObjectId ObjectId使用12字节的存储空间,每个字节两位十六进制数字,是一个24位的字符串。...日期在数据中是以标准纪元开水的毫秒数的形式存储的,没有与之相关的时区信息。 9、Null null用于表示空值或者不存在的字段。...shell将数据库里的符号类型转换成字符串。现在已经过时。 13、Timestamp(时间戳) BSON有一个MongoDB内部使用的特殊的时间戳类型,和常的日期类型没有关系。

    4.2K10

    MongoDB的使用

    #2、文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。 #3、MongoDB区分类型和大小写。 #4、MongoDB的文档不能有重复的键。...#5、文档中的值可以是多种不同的数据类型,也可以是一个完整的内嵌文档。文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。 文档键命名规范: #1、键不能含有\0 (空字符)。...如果将MongoDB中的一个文档比喻为关系型数据的一行,那么一个集合就是相当于一张表 #1、集合存在于数据库中,通常情况下为了方便管理,不同格式和类型的数据应该插入到不同的集合,但其实集合没有固定的结构...不同集合"_id"的值可以重复,但同一集合内"_id"的值必须唯一 #1、ObjectId ObjectId是"_id"的默认类型。...ObjectId采用12字节的存储空间,是一个由24个十六进制数字组成的字符串 0|1|2|3| 4|5|6| 7|8 9|10|11 时间戳 机器

    3.7K40

    存储和使用流数据(BLOBs和CLOBs)

    如果二进制流文件(BLOB)包含单个非打印字符$CHAR(0),则被认为是空二进制流。它相当于""空二进制流程值:它存在(不是null),但长度为0。...无法使用指定的COLLATE 值定义流字段。...嵌入式SQL返回相同的OID,但以编码%LIST的形式返回。...因此,当应用到查询中的流字段时: 不同的子句对重复的流数据值没有影响。 DISTINCT子句将流字段为NULL的记录数减少为一个NULL记录。 GROUP BY子句对重复的流数据值没有影响。...如果VARCHAR精度小于实际流数据的长度,则将返回值截断为VARCHAR精度。 如果VARCHAR精度大于实际流数据的长度,则返回值为实际流数据的长度。 不执行填充。

    1.4K20
    领券