Springboot MongoDB实现自增序列的项目实践

 更新时间:2023年07月04日 16:51:39   作者:它山之石,可以攻玉  
在某些特定的业务场景下,会需要使用自增的序列来维护数据,本文主要介绍了Springboot MongoDB实现自增序列的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

在某些特定的业务场景下,会需要使用自增的序列来维护数据,目前项目中因为使用MongoDB,顾记录一下如何使用MongoDB实现自增序列。

MongoDB自增序列原理

MongoDB本身不具有自增序列的功能,但是MongoDB的$inc操作是具有原子性的,因为操作的原子性,那么就可以通过$inc序列+1的值作用本次序列,实现自增序列。

实现自增序列

定义自增序列IdSequence.java

@Document(collection = "sequences")
@Data
public class IdSequence {
    @Id
    private String id;
    /**
     * 自增的序列
     */
    private long nextId;
}

定义自增序列类型枚举IdType.java

@Getter
@AllArgsConstructor
public enum IdType {
    /**
     * 图书
     */
    BOOK("book");
    private final String type;
}

定义获取自增序列辅助类IdHelper.java

@Component
public class IdHelper {
    private final MongoTemplate mongoTemplate;
    public IdHelper(MongoTemplate mongoTemplate) {
        this.mongoTemplate = mongoTemplate;
    }
    /**
     * 查询指定类型的自增序列
     *
     * @param idType 类型
     * @return 自增序列
     */
    public long nextId(IdType idType) {
        //构建查询对象
        Query query = Query.query(Criteria.where(LambdaUtil.getFieldName(IdSequence::getId)).is(idType.getType()));
        //构建自增条件
        Update update = new Update().inc(LambdaUtil.getFieldName(IdSequence::getNextId), 1L);
        //构建选项
        FindAndModifyOptions options = FindAndModifyOptions.options().upsert(true).returnNew(true);
        //查询自增序列
        IdSequence idSequence = mongoTemplate.findAndModify(query, update, options, IdSequence.class);
        //返回自增序列
        return Objects.requireNonNull(idSequence).getNextId();
    }
}

定义测试类

@RestController
@RequestMapping(value = "/id")
public class IdSequenceController {
    @Resource
    private IdHelper idHelper;
    @GetMapping(value = "/nextId")
    public long nextId() {
        return idHelper.nextId(IdType.BOOK);
    }
}

总结

使用MongoDB实现自增序列是基于MongoDB的$inc操作指令,经过测试100个并发下没有发现重复id的产生,但是还是建议使用MongoDB自己的Id生成策略,毕竟MongoDB作为非关系型数据库,如果维护一个自增序列,性能上肯定没有ObjectId好,而且分片情况下需要自己校验自增序列的唯一性,当然在某些特殊的业务场景下必须要使用自增序列的,也属于正常。

到此这篇关于Springboot MongoDB实现自增序列的项目实践的文章就介绍到这了,更多相关Springboot MongoDB自增序列内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java跳出循环的方式汇总

    java跳出循环的方式汇总

    本文介绍了Java中三种常用的跳出循环的语句:break、continue和return,break用于完全结束循环并跳出循环体;continue用于跳过本次循环体中尚未执行的语句,开始下一次循环;return用于结束方法,每种方法给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2025-02-02
  • Spring 事务事件监控及实现原理解析

    Spring 事务事件监控及实现原理解析

    本文首先会使用实例进行讲解Spring事务事件是如何使用的,然后会讲解这种使用方式的实现原理。感兴趣的朋友跟随小编一起看看吧
    2018-09-09
  • 如何解决redisTemplate注入为空问题

    如何解决redisTemplate注入为空问题

    这篇文章主要介绍了如何解决redisTemplate注入为空问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • java RocketMQ快速入门基础知识

    java RocketMQ快速入门基础知识

    这篇文章主要介绍了java RocketMQ快速入门基础知识,所以RocketMQ是站在巨人的肩膀上(kafka),又对其进行了优化让其更满足互联网公司的特点。它是纯Java开发,具有高吞吐量、高可用性、适合大规模分布式系统应用的特点。,需要的朋友可以参考下
    2019-06-06
  • Spring Validation和Hibernate Validator结合国际化代码实例

    Spring Validation和Hibernate Validator结合国际化代码实例

    这篇文章主要介绍了Spring Validation和Hibernate Validator结合国际化代码实例,我们需要对请求参数进行非空、长度、正确性进行校验, 本文主要讲解Spring Validation 和 Hibernate Validator, 同时整合i18n(国际化)实现参数校验自动,需要的朋友可以参考下
    2023-10-10
  • (starters)springboot-starter整合阿里云datahub方式

    (starters)springboot-starter整合阿里云datahub方式

    这篇文章主要介绍了(starters)springboot-starter整合阿里云datahub方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • JAVA序列化和反序列化的底层实现原理解析

    JAVA序列化和反序列化的底层实现原理解析

    这篇文章主要介绍了JAVA序列化和反序列化的底层实现原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • 浅析Spring boot 中 logback 配置<springProperty> 读取application.properties 中的属性

    浅析Spring boot 中 logback 配置<springPropert

    这篇文章主要介绍了浅析Spring boot 中 logback 配置<springProperty> 读取application.properties 中的属性,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-02-02
  • 详解JAVA常用的时间操作【实用】

    详解JAVA常用的时间操作【实用】

    本文主要介绍了JAVA一些常用的时间操作,很实用,相信大家在开发项目时会用到,下面就跟小编一起来看下吧
    2016-12-12
  • Springdoc替换swagger的实现步骤分解

    Springdoc替换swagger的实现步骤分解

    最近在spring看到的,spring要对api文档动手了,有些人说swagger不好用,其实也没那么不好用,有人说代码还是有点侵入性,这倒是真的,我刚试了springdoc可以说还是有侵入性但是也可以没有侵入性,这就看你对文档有什么要求了
    2023-02-02

最新评论