转载请标明出处:
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?相关推荐

  1. 参考 objectId 实现分布式 id

    1.参考文档 https://mongodb.github.io/mongo-java-driver/4.5/apidocs/bson/org/bson/types/ObjectId.html htt ...

  2. 来吧,自己动手撸一个分布式ID生成器组件

    在经过了众多轮的面试之后,小林终于进入到了一家互联网公司的基础架构组,小林目前在公司有使用到架构组研究到分布式id生成器,前一阵子大概看了下其内部的实现,发现还是存在一些架构设计不合理之处.但是又由于 ...

  3. 【面朝大厂】面试官:说几种常用的分布式 ID 解决方案

    点击上方"Java基基",选择"设为星标" 做积极的人,而不是积极废人! 源码精品专栏 原创 | Java 2020 超神之路,很肝~ 中文详细注释的开源项目 ...

  4. 分布式 id 生成器

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 本文来源: www.juejin.im/post/5d8882d8 ...

  5. 分布式ID生成器的解决方案总结

    转载自 分布式ID生成器的解决方案总结 在互联网的业务系统中,涉及到各种各样的ID,如在支付系统中就会有支付ID.退款ID等.那一般生成ID都有哪些解决方案呢?特别是在复杂的分布式系统业务场景中,我们 ...

  6. 6位顺序号生成_分布式id生成策略,我和面试官扯了一个半小时

    一.分布式系统带来ID生成挑战 在分布式系统中,往往需要对大量的数据如订单.账户进行标识,以一个有意义的有序的序列号来作为全局唯一的ID. 而分布式系统中我们对ID生成器要求又有哪些呢? 全局唯一性: ...

  7. 分布式ID生成的9种方法,特好用!

    前言 业务量小于500W或数据容量小于2G的时候单独一个mysql即可提供服务,再大点的时候就进行读写分离也可以应付过来.但当主从同步也扛不住的是就需要分表分库了,但分库分表后需要有一个唯一ID来标识 ...

  8. 解决方案:分布式ID生成

    解决方案:分布式ID生成 关键词 UUID,32位 数据库自增ID 中间件(redis,原子操作 INCR和INCRBY) Snowflake,64 bit,自增排序(强依赖机器时钟) 一个ID一般来 ...

  9. 分布式ID | 这六种分布式ID生成方法,总有一款适合你

    Hi!我是小小,我们又见面了,我们今天的话题是六种分布式ID生成算法. 分布式ID简介 什么是分布式ID 在数据量不大的时候,单库单表完全可以支撑现有业务,数据量再大一点搞个MySql主从同步也可以. ...

最新文章

  1. A Survey on Techniques in NLP--阅读笔记
  2. SQL Server调优系列进阶篇(如何维护数据库索引)
  3. 【深度学习】Swin-Transformer和EfficientNet对比分析
  4. 【深度学习】利用一些API进行图像数据增广
  5. js通过classname来获取元素
  6. HPU-- 1190 確率
  7. Vue+G2:Please specify the container for the chart! + Cannot read property ‘appendChild‘ of null
  8. Python自动化运维之13、异常处理及反射(__import__,getattr,hasattr,setattr)
  9. 宠物也能买保险了!鼻纹识别就能建立专属电子档案
  10. \045在字符串中输出为%
  11. 无痕埋点(声明式)(原创)
  12. 解决eclipse安装Darkest Dark Theme报错
  13. 2019一键清空朋友圈_微信一键删除好友软件(2019微信批量删除好友最快速有效的方法)...
  14. 电脑耳机没声音怎么设置?Windows系统适用
  15. 微信支付——功能测试用例
  16. 好用的邮箱客户端有哪些,办公用什么邮箱客户端呢?
  17. 计算机组成原理第二版第6章ppt,计算机组成原理第6章简.ppt
  18. 【Unity基础】人物控制的三种方式(键盘)、(鼠标)、(键鼠)
  19. java .net 加密解密,【汉字加密解密】一个16进制,可用于.net与java接口加密、解密...
  20. 墨客和宁波市政府签订战略合作协议

热门文章

  1. php 循环 post,如何在php中使用jQuery递归调用POST循环请求
  2. asp.net mvc redis同步mysql_Mysql和Redis数据同步策略 - 元思 - 博客园
  3. 金志文机器人歌叫什么_MIR发布《移动机器人部署安全指南》白皮书
  4. 图像过滤,so easy~~
  5. 快速排序 与 归并排序
  6. Python入门--创建类的对象
  7. 数据库实验6 数据库的分组查询和统计查询
  8. Pikachu实验重现2(Sql的注入)
  9. Wannafly交流赛1: D. 白兔的字符串(随机+EXKMP)
  10. javascript之字符串常用方法学习 charAt concat indexOf substring substr toUpperCase