当前位置: 首页 > news >正文

Spring boot MongoDB实现自增序列

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

MongoDB自增序列原理

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

实现自增序列

定义自增序列IdSequence.java

@Document(collection = "sequences")
@Data
public class IdSequence {@Idprivate 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 {@Resourceprivate IdHelper idHelper;@GetMapping(value = "/nextId")public long nextId() {return idHelper.nextId(IdType.BOOK);}}

总结

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

http://www.lryc.cn/news/94535.html

相关文章:

  • MyBatis查询数据库【秘籍宝典】
  • 目标检测舰船数据集整合
  • 第一章 Android 基础--开发环境搭建
  • 【LeetCode周赛】2022上半年题目精选集——二分
  • vuejs如何将线上PDF转为base64编码
  • Repo工作原理及常用命令总结——2023.07
  • Python教程(2)——开发python常用的IDE
  • 【lambda函数】lambda()函数
  • ThreeJs CSS3DObject 点击失效问题
  • 飞书深诺、恒生面试(部分)(未完全解析)
  • Spring Cloud Config: 了解、原理和使用
  • 基于图的路径规划算法对比
  • SQL Server 索引
  • java抽奖
  • 【springboot+云计算】B/S医院信息管理系统源码(云HIS)
  • go 读写 excel 读取 txt 繁体中文转码
  • docker网卡的IP地址修改
  • python与深度学习——基础环境搭建
  • Django实现简单的音乐播放器 2
  • OpenCV 入门教程:图像读取和显示
  • 什么是GPT?
  • 如何通过浏览器配置哪些网页不走代理服务器,Lantern开启后部分网页打不开了
  • Redis常见面试题
  • 应用零信任原则:案例研究和现场经验教训
  • RabbitMQ系列(14)--Topics交换机的简介与实现
  • 解决PyInstaller打包selenium脚本时弹出driver终端窗口
  • 基于卷积神经网络VGG的猫狗识别
  • mysql查询语句练习总结(涵盖所有sql语法)
  • TypeScript 中 any、unknown、never 和 void 有什么区别?
  • 算法Day60 | 84.柱状图中最大的矩形,刷题总结