博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
分布式主键生成策略
阅读量:5911 次
发布时间:2019-06-19

本文共 1024 字,大约阅读时间需要 3 分钟。

在分布式高并发的情况下,分布式主键生成策略可参考mongodb的objectid实现。


ObjectId是一种轻量的,不同的机器不同的进程都能用全局唯一的同种方法生成它,而不是采用传统的自增的主键策略,因为在多台服务器上同步自动增加主键既费力又费时。ObjectId
是一个24位的字符串,
它是由一组十六进制的字符构成,每个字节两位的十六进制数字,总共用了12字节的存储空间。MongoDB的这种设计,体现着空间换时间的思想。官网中对ObjectId的规范,如图所示。

图官网对ObjectId的规范

1)     Time

时间戳。将刚才生成的objectid的前4位进行提取“4e7020cb”,然后按照十六进制转为十进制,变为“1315971275”,这个数字就是一个时间戳。通过时间戳的转换,就成了易看清的时间格式,如图3所示。

2)    Machine

机器。接下来的三个字节就是“7cac81”,这三个字节是所在主机的唯一标识符,一般是机器主机名的散列值,这样就确保了不同主机生成不同的机器hash值,确保在分布式中不造成冲突,这也就是在同一台机器生成的objectId中间的字符串都是一模一样的原因。

3)    PID

进程ID。上面的Machine是为了确保在不同机器产生的objectId不冲突,而pid就是为了在同一台机器不同的mongodb进程产生了objectId不冲突,接下来的“af71”两位就是产生objectId的进程标识符。

4)    INC

自增计数器。前面的九个字节是保证了一秒内不同机器不同进程生成objectId不冲突,这后面的三个字节“36236b”是一个自动增加的计数器,用来确保在同一秒内产生的objectId也不会发现冲突,允许256的3次方等于16777216条记录的唯一性。

总的来看,objectId的前4个字节时间戳,记录了文档创建的时间;接下来3个字节代表了所在主机的唯一标识符,确定了不同主机间产生不同的objectId;后2个字节的进程id,决定了在同一台机器下,不同mongodb进程产生不同的objectId;最后通过3个字节的自增计数器,确保同一秒内产生objectId的唯一性。ObjectId的这个主键生成策略,很好地解决了在分布式环境下高并发情况主键唯一性问题,值得学习借鉴。

参考: 

转载于:https://www.cnblogs.com/dailidong/p/7571131.html

你可能感兴趣的文章
通过Gearman实现MySQL到Redis的数据复制
查看>>
eclipse 自动为getter和setter添加注释
查看>>
oracle--数据库
查看>>
kafka 监控之Mx4jLoader
查看>>
wireshark windows 编译
查看>>
XBImageFilters
查看>>
chpter11~函数和函数式编程
查看>>
Hadoop之HDFS的常用命令
查看>>
分布式系统架构解决方案之Dubbo(三)--Dubbo管理端 和 Dubbo综合案例
查看>>
The function getUserId must be used with...解决办法
查看>>
Class yii\base\View
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
使用Unirest发送Json的格式数据
查看>>
亚洲诚信&华为云 | 双11钜惠提前来袭,错过等一年!
查看>>
目前所学的关键字整理
查看>>
我的友情链接
查看>>
Eclipse常用配置
查看>>
linux修改IP和DNS
查看>>
我的友情链接
查看>>