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自增序列内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
SpringBoot集成elasticsearch使用图文详解
Spring Boot集成Elasticsearch其实非常简单,这篇文章主要给大家介绍了关于SpringBoot集成elasticsearch使用的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下2023-04-04SpringMVC处理器映射器HandlerMapping详解
这篇文章主要介绍了SpringMVC处理器映射器HandlerMapping详解,在SpringMVC中会有很多请求,每个请求都需要一个HandlerAdapter处理,具体接收到一个请求之后使用哪个HandlerAdapter进行处理呢,他们的过程是什么,需要的朋友可以参考下2023-09-09springboot 2.3之后消失的hibernate-validator解决方法
这篇文章主要介绍了springboot 2.3之后消失的hibernate-validator解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2020-08-08Java+Eclipse+Selenium环境搭建的方法步骤
这篇文章主要介绍了Java+Eclipse+Selenium环境搭建的方法步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2019-06-06
最新评论