转载自:
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()); }
相关推荐
详解使用MongoDB+Springboot实现分布式ID的方法 在分布式系统中,生成唯一的ID是非常重要的,否则可能会导致数据混乱。MongoDB提供了一种轻量级的ObjectId机制,可以生成全局唯一的ID。Springboot是Java开发的热门...
如何使用MongoDB+Springboot实现分布式ID? 如何在springcloud分布式系统中实现分布式锁? 如何用Redlock实现分布式锁 如何在IDEA启动多个Spring Boot工程实例 JWT如何在Spring Cloud微服务系统中在服务相互调时传
在分布式和微服务架构中,Springboot和MongoDB是非常流行的技术栈。 Springboot是最简单的使用Spring的方式,而MongoDB是最流行的NoSQL数据库。两者在实际应用中使用率极高。本文将对Springboot整合MongoDB进行CRUD...
开发者可以通过定义接口并使用 Spring Data MongoDB 自动实现这些接口来实现对数据库的 CRUD(创建、读取、更新、删除)操作。 2. **Repository** 接口:在 Spring Data MongoDB 中,我们通常会定义一个接口,继承...
本文将深入探讨如何使用SpringBoot结合MongoDB构建一个简约的个人博客系统,旨在帮助开发者理解和掌握这两种技术的整合应用。 首先,SpringBoot是Spring框架的轻量级版本,它极大地简化了Spring应用的初始设置和...
本文将深入探讨SpringBoot如何与MongoDB进行深度整合,以实现高效的数据操作。 一、SpringBoot与MongoDB的集成 1. 添加依赖:在SpringBoot项目中,我们需要在`pom.xml`或`build.gradle`文件中引入MongoDB的Spring...
1.包含对文档的基本增删改查(CRUD)的功能,基于Spring-data的MongoRepository扩展实现,update和insert操作本质上使用的同一个DAO接口,区别是update操作必须提供主键id,insert操作不提供id字段; 2.包含数据排序...
`mongodb-jpa`允许我们在SpringBoot应用中使用JPA风格的操作MongoDB,它基于`Spring Data MongoDB`,但提供了类似JPA的API。例如,我们可以使用`@Query`注解执行自定义的MongoDB查询,或者利用`@Entity`和`@Table`...
3. **MongoDB实体映射**:使用`@Document`注解定义MongoDB的集合,`@Id`标注主键,其他的字段可以使用`@Field`进行映射。 4. **Repository接口**:Spring Data MongoDB允许我们定义基于CRUD操作的Repository接口,...
总的来说,"mongo:的springboot + mongodb的" 主题涵盖了使用 Spring Boot 集成 MongoDB 开发环境的知识点,包括配置数据库连接、定义实体类、创建 repository 接口、实现 CRUD 操作,以及通过 RESTful API 与前端 ...
Spring Boot 2.x 教程中的MongoDB使用详解 MongoDB是一个流行的NoSQL数据库系统,设计为分布式存储,提供高性能和可伸缩性。它的数据结构以BSON(Binary JSON)为主,允许存储复杂的数据类型,特别适合Node.js应用...
8. **Document对象映射**:项目中会定义Java类作为MongoDB文档的映射,这些类通常使用`@Document`注解,并且字段可能使用`@Id`、`@Field`等注解来指定MongoDB中的对应字段。 9. **数据访问示例**:LucasSantos可能...
在实际开发过程中,服务端通常会使用MySQL、MongoDB等数据库存储用户信息和题目数据。数据库连接配置、事务管理和数据访问层(DAO)也是源码中的重要组成部分。此外,考虑到性能和可扩展性,服务端可能还会涉及缓存...
如果使用的是 MongoDB 集群,可以使用逗号分隔多个 IP 地址和端口。 为了使用 MongoDB,我们需要创建数据实体类。例如,创建一个名为 `UserEntity` 的用户实体类: ```java public class UserEntity implements ...
3. **数据持久化**:SpringBoot可能使用JPA(Java Persistence API)和Hibernate进行数据库操作,如MySQL或MongoDB,用于存储文章和评论数据。 4. **安全控制**:Spring Security可以用来处理用户登录、权限验证等...
这个例子提供了一个快速上手SpringBoot与MongoDB集成的途径,你可以直接下载并运行,以便于理解和学习如何在实际项目中使用mongoTemplate进行数据操作。通过这种方式,你可以更深入地理解SpringBoot的自动化配置、...
该压缩包文件“基于springboot微信小程序的超市购物系统源码数据库文档.zip”包含了一个完整的超市购物系统的源代码和数据库文档,特别强调了其基于SpringBoot框架和微信小程序的实现。SpringBoot是Java开发中的一个...
MongoDB是一个基于分布式文件存储的开源文档数据库,它使用JSON样式的文档作为数据模型,支持丰富的查询表达式、动态Schema设计,适合处理大量非结构化和半结构化数据。MongoDB具有高性能、高可用性、可扩展性的特点...