如何使用MongoDB+Springboot实现分布式ID?
转载请标明出处:
http://blog.csdn.net/forezp/article/details/69056017
本文出自方志朋的博客
一、背景
如何实现分布式id,搜索相关的资料,一般会给出这几种方案:
- 使用数据库自增Id
- 使用reids的incr命令
- 使用UUID
- Twitter的snowflake算法
- 利用zookeeper生成唯一ID
- MongoDB的ObjectId
另外,在我通过爬取知乎用户id发现,知乎的用户id是32位的,初步断定知乎采用的是md5加密,然后全部转换成小写。至于如何爬取知乎用户信息,见我之前分享的文章。本文采取的技术方案采取的是mogoodb的objectId。
二.mongodb如何实现分布式ID
MongoDB的ObjectId设计成轻量型的,不同的机器都能用全局唯一的同种方法方便地生成它。MongoDB 从一开始就设计用来作为分布式数据库,处理多个节点是一个核心要求。使其在分片环境中要容易生成得多。
它的格式:
前4 个字节是从标准纪元开始的时间戳,单位为秒。时间戳,与随后的5 个字节组合起来,提供了秒级别的唯一性。由于时间戳在前,这意味着ObjectId 大致会按照插入的顺序排列。这对于某些方面很有用,如将其作为索引提高效率。这4 个字节也隐含了文档创建的时间。绝大多数客户端类库都会公开一个方法从ObjectId 获取这个信息。
接下来的3 字节是所在主机的唯一标识符。通常是机器主机名的散列值。这样就可以确保不同主机生成不同的ObjectId,不产生冲突。
为了确保在同一台机器上并发的多个进程产生的ObjectId 是唯一的,接下来的两字节来自产生ObjectId 的进程标识符(PID)。前9 字节保证了同一秒钟不同机器不同进程产生的ObjectId 是唯一的。
后3 字节就是一个自动增加的计数器,确保相同进程同一秒产生的ObjectId 也是不一样的。同一秒钟最多允许每个进程拥有2563(16 777 216)个不同的ObjectId。
三、编码
在springboot中引入mongodb:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- 开启web--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--mongodb --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency>
创建一个实体类:
public class Customer {@Idpublic String id;public String firstName;public String lastName;public Customer() {}public Customer(String firstName, String lastName) {this.firstName = firstName;this.lastName = lastName;}@Overridepublic String toString() {return String.format("Customer[id=%s, firstName='%s', lastName='%s']",id, firstName, lastName);}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getFirstName() {return firstName;}public void setFirstName(String firstName) {this.firstName = firstName;}public String getLastName() {return lastName;}public void setLastName(String lastName) {this.lastName = lastName;}
}
创建mongodb 接口类:
/*** Created by fangzhipeng on 2017/4/1.*/public interface CustomerRepository extends MongoRepository<Customer, String> {public Customer findByFirstName(String firstName);public List<Customer> findByLastName(String lastName);}
测试类:
@AutowiredCustomerRepository customerRepository;@Test
public void mongodbIdTest(){
Customer customer=new Customer("lxdxil","dd");customer=customerRepository.save(customer);logger.info( "mongodbId:"+customer.getId());
}
四、参考资料
Accessing Data with MongoDB
MongoDB深究之ObjectId
MongoDB 教程
扫码关注公众号有惊喜
(转载本站文章请注明作者和出处 方志朋的博客)
转载于:https://www.cnblogs.com/forezp/p/9852164.html
如何使用MongoDB+Springboot实现分布式ID?相关推荐
- 参考 objectId 实现分布式 id
1.参考文档 https://mongodb.github.io/mongo-java-driver/4.5/apidocs/bson/org/bson/types/ObjectId.html htt ...
- 来吧,自己动手撸一个分布式ID生成器组件
在经过了众多轮的面试之后,小林终于进入到了一家互联网公司的基础架构组,小林目前在公司有使用到架构组研究到分布式id生成器,前一阵子大概看了下其内部的实现,发现还是存在一些架构设计不合理之处.但是又由于 ...
- 【面朝大厂】面试官:说几种常用的分布式 ID 解决方案
点击上方"Java基基",选择"设为星标" 做积极的人,而不是积极废人! 源码精品专栏 原创 | Java 2020 超神之路,很肝~ 中文详细注释的开源项目 ...
- 分布式 id 生成器
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 本文来源: www.juejin.im/post/5d8882d8 ...
- 分布式ID生成器的解决方案总结
转载自 分布式ID生成器的解决方案总结 在互联网的业务系统中,涉及到各种各样的ID,如在支付系统中就会有支付ID.退款ID等.那一般生成ID都有哪些解决方案呢?特别是在复杂的分布式系统业务场景中,我们 ...
- 6位顺序号生成_分布式id生成策略,我和面试官扯了一个半小时
一.分布式系统带来ID生成挑战 在分布式系统中,往往需要对大量的数据如订单.账户进行标识,以一个有意义的有序的序列号来作为全局唯一的ID. 而分布式系统中我们对ID生成器要求又有哪些呢? 全局唯一性: ...
- 分布式ID生成的9种方法,特好用!
前言 业务量小于500W或数据容量小于2G的时候单独一个mysql即可提供服务,再大点的时候就进行读写分离也可以应付过来.但当主从同步也扛不住的是就需要分表分库了,但分库分表后需要有一个唯一ID来标识 ...
- 解决方案:分布式ID生成
解决方案:分布式ID生成 关键词 UUID,32位 数据库自增ID 中间件(redis,原子操作 INCR和INCRBY) Snowflake,64 bit,自增排序(强依赖机器时钟) 一个ID一般来 ...
- 分布式ID | 这六种分布式ID生成方法,总有一款适合你
Hi!我是小小,我们又见面了,我们今天的话题是六种分布式ID生成算法. 分布式ID简介 什么是分布式ID 在数据量不大的时候,单库单表完全可以支撑现有业务,数据量再大一点搞个MySql主从同步也可以. ...
最新文章
- A Survey on Techniques in NLP--阅读笔记
- SQL Server调优系列进阶篇(如何维护数据库索引)
- 【深度学习】Swin-Transformer和EfficientNet对比分析
- 【深度学习】利用一些API进行图像数据增广
- js通过classname来获取元素
- HPU-- 1190 確率
- Vue+G2:Please specify the container for the chart! + Cannot read property ‘appendChild‘ of null
- Python自动化运维之13、异常处理及反射(__import__,getattr,hasattr,setattr)
- 宠物也能买保险了!鼻纹识别就能建立专属电子档案
- \045在字符串中输出为%
- 无痕埋点(声明式)(原创)
- 解决eclipse安装Darkest Dark Theme报错
- 2019一键清空朋友圈_微信一键删除好友软件(2019微信批量删除好友最快速有效的方法)...
- 电脑耳机没声音怎么设置?Windows系统适用
- 微信支付——功能测试用例
- 好用的邮箱客户端有哪些,办公用什么邮箱客户端呢?
- 计算机组成原理第二版第6章ppt,计算机组成原理第6章简.ppt
- 【Unity基础】人物控制的三种方式(键盘)、(鼠标)、(键鼠)
- java .net 加密解密,【汉字加密解密】一个16进制,可用于.net与java接口加密、解密...
- 墨客和宁波市政府签订战略合作协议
热门文章
- php 循环 post,如何在php中使用jQuery递归调用POST循环请求
- asp.net mvc redis同步mysql_Mysql和Redis数据同步策略 - 元思 - 博客园
- 金志文机器人歌叫什么_MIR发布《移动机器人部署安全指南》白皮书
- 图像过滤,so easy~~
- 快速排序 与 归并排序
- Python入门--创建类的对象
- 数据库实验6 数据库的分组查询和统计查询
- Pikachu实验重现2(Sql的注入)
- Wannafly交流赛1: D. 白兔的字符串(随机+EXKMP)
- javascript之字符串常用方法学习 charAt concat indexOf substring substr toUpperCase