`
357029540
  • 浏览: 735643 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

如何使用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 {

    @Id
    public String id;

    public String firstName;
    public String lastName;

    public Customer() {}

    public Customer(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    @Override
    public 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);

}

 测试类:

@Autowired
    CustomerRepository 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 教程

  • 大小: 104.5 KB
分享到:
评论

相关推荐

    详解如何使用MongoDB+Springboot实现分布式ID的方法

    详解使用MongoDB+Springboot实现分布式ID的方法 在分布式系统中,生成唯一的ID是非常重要的,否则可能会导致数据混乱。MongoDB提供了一种轻量级的ObjectId机制,可以生成全局唯一的ID。Springboot是Java开发的热门...

    SpringCloudLearning_forezp.tar.gz

    如何使用MongoDB+Springboot实现分布式ID? 如何在springcloud分布式系统中实现分布式锁? 如何用Redlock实现分布式锁 如何在IDEA启动多个Spring Boot工程实例 JWT如何在Spring Cloud微服务系统中在服务相互调时传

    Springboot整合MongoDB进行CRUD操作的两种方式(实例代码详解)

    在分布式和微服务架构中,Springboot和MongoDB是非常流行的技术栈。 Springboot是最简单的使用Spring的方式,而MongoDB是最流行的NoSQL数据库。两者在实际应用中使用率极高。本文将对Springboot整合MongoDB进行CRUD...

    mongoDB springBoot(cloud)整合mongoDB(增删改查)

    开发者可以通过定义接口并使用 Spring Data MongoDB 自动实现这些接口来实现对数据库的 CRUD(创建、读取、更新、删除)操作。 2. **Repository** 接口:在 Spring Data MongoDB 中,我们通常会定义一个接口,继承...

    基于springboot+mongodb搭建的简约个人博客系统.zip

    本文将深入探讨如何使用SpringBoot结合MongoDB构建一个简约的个人博客系统,旨在帮助开发者理解和掌握这两种技术的整合应用。 首先,SpringBoot是Spring框架的轻量级版本,它极大地简化了Spring应用的初始设置和...

    springboot-mongodb:springboot-mongodb

    本文将深入探讨SpringBoot如何与MongoDB进行深度整合,以实现高效的数据操作。 一、SpringBoot与MongoDB的集成 1. 添加依赖:在SpringBoot项目中,我们需要在`pom.xml`或`build.gradle`文件中引入MongoDB的Spring...

    java开发oa系统源码下载-Spring-mongoDB:Springboot连接mongoDB数据库

    1.包含对文档的基本增删改查(CRUD)的功能,基于Spring-data的MongoRepository扩展实现,update和insert操作本质上使用的同一个DAO接口,区别是update操作必须提供主键id,insert操作不提供id字段; 2.包含数据排序...

    springboot整合mongodb详解

    `mongodb-jpa`允许我们在SpringBoot应用中使用JPA风格的操作MongoDB,它基于`Spring Data MongoDB`,但提供了类似JPA的API。例如,我们可以使用`@Query`注解执行自定义的MongoDB查询,或者利用`@Entity`和`@Table`...

    demo13-mongodb.rar

    3. **MongoDB实体映射**:使用`@Document`注解定义MongoDB的集合,`@Id`标注主键,其他的字段可以使用`@Field`进行映射。 4. **Repository接口**:Spring Data MongoDB允许我们定义基于CRUD操作的Repository接口,...

    mongo:的springboot + mongodb的

    总的来说,"mongo:的springboot + mongodb的" 主题涵盖了使用 Spring Boot 集成 MongoDB 开发环境的知识点,包括配置数据库连接、定义实体类、创建 repository 接口、实现 CRUD 操作,以及通过 RESTful API 与前端 ...

    Spring Boot 2.x基础教程:使用MongoDB(csdn)————程序.pdf

    Spring Boot 2.x 教程中的MongoDB使用详解 MongoDB是一个流行的NoSQL数据库系统,设计为分布式存储,提供高性能和可伸缩性。它的数据结构以BSON(Binary JSON)为主,允许存储复杂的数据类型,特别适合Node.js应用...

    springboot-mongodb-LucasSantos

    8. **Document对象映射**:项目中会定义Java类作为MongoDB文档的映射,这些类通常使用`@Document`注解,并且字段可能使用`@Id`、`@Field`等注解来指定MongoDB中的对应字段。 9. **数据访问示例**:LucasSantos可能...

    SpringBoot答题微信小程序服务端源码.zip

    在实际开发过程中,服务端通常会使用MySQL、MongoDB等数据库存储用户信息和题目数据。数据库连接配置、事务管理和数据访问层(DAO)也是源码中的重要组成部分。此外,考虑到性能和可扩展性,服务端可能还会涉及缓存...

    Spring boot中mongodb的使用

    如果使用的是 MongoDB 集群,可以使用逗号分隔多个 IP 地址和端口。 为了使用 MongoDB,我们需要创建数据实体类。例如,创建一个名为 `UserEntity` 的用户实体类: ```java public class UserEntity implements ...

    一个使用Vue.js和SpringBoot的个人博客网站.zip

    3. **数据持久化**:SpringBoot可能使用JPA(Java Persistence API)和Hibernate进行数据库操作,如MySQL或MongoDB,用于存储文章和评论数据。 4. **安全控制**:Spring Security可以用来处理用户登录、权限验证等...

    MogoDB_demo.rar

    这个例子提供了一个快速上手SpringBoot与MongoDB集成的途径,你可以直接下载并运行,以便于理解和学习如何在实际项目中使用mongoTemplate进行数据操作。通过这种方式,你可以更深入地理解SpringBoot的自动化配置、...

    基于springboot微信小程序的超市购物系统源码数据库文档.zip

    该压缩包文件“基于springboot微信小程序的超市购物系统源码数据库文档.zip”包含了一个完整的超市购物系统的源代码和数据库文档,特别强调了其基于SpringBoot框架和微信小程序的实现。SpringBoot是Java开发中的一个...

    SpringbootMongoDb

    MongoDB是一个基于分布式文件存储的开源文档数据库,它使用JSON样式的文档作为数据模型,支持丰富的查询表达式、动态Schema设计,适合处理大量非结构化和半结构化数据。MongoDB具有高性能、高可用性、可扩展性的特点...

Global site tag (gtag.js) - Google Analytics