Springboot MongoDB實(shí)現(xiàn)自增序列的項(xiàng)目實(shí)踐
在某些特定的業(yè)務(wù)場景下,會(huì)需要使用自增的序列來維護(hù)數(shù)據(jù),目前項(xiàng)目中因?yàn)槭褂肕ongoDB,顧記錄一下如何使用MongoDB實(shí)現(xiàn)自增序列。
MongoDB自增序列原理
MongoDB本身不具有自增序列的功能,但是MongoDB的$inc操作是具有原子性的,因?yàn)椴僮鞯脑有裕敲淳涂梢酝ㄟ^$inc序列+1的值作用本次序列,實(shí)現(xiàn)自增序列。
實(shí)現(xiàn)自增序列
定義自增序列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) {
? ? ? ? //構(gòu)建查詢對象
? ? ? ? Query query = Query.query(Criteria.where(LambdaUtil.getFieldName(IdSequence::getId)).is(idType.getType()));
? ? ? ? //構(gòu)建自增條件
? ? ? ? Update update = new Update().inc(LambdaUtil.getFieldName(IdSequence::getNextId), 1L);
? ? ? ? //構(gòu)建選項(xiàng)
? ? ? ? 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);
? ? }
}總結(jié)
使用MongoDB實(shí)現(xiàn)自增序列是基于MongoDB的$inc操作指令,經(jīng)過測試100個(gè)并發(fā)下沒有發(fā)現(xiàn)重復(fù)id的產(chǎn)生,但是還是建議使用MongoDB自己的Id生成策略,畢竟MongoDB作為非關(guān)系型數(shù)據(jù)庫,如果維護(hù)一個(gè)自增序列,性能上肯定沒有ObjectId好,而且分片情況下需要自己校驗(yàn)自增序列的唯一性,當(dāng)然在某些特殊的業(yè)務(wù)場景下必須要使用自增序列的,也屬于正常。
到此這篇關(guān)于Springboot MongoDB實(shí)現(xiàn)自增序列的項(xiàng)目實(shí)踐的文章就介紹到這了,更多相關(guān)Springboot MongoDB自增序列內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring 事務(wù)事件監(jiān)控及實(shí)現(xiàn)原理解析
本文首先會(huì)使用實(shí)例進(jìn)行講解Spring事務(wù)事件是如何使用的,然后會(huì)講解這種使用方式的實(shí)現(xiàn)原理。感興趣的朋友跟隨小編一起看看吧2018-09-09
java RocketMQ快速入門基礎(chǔ)知識(shí)
這篇文章主要介紹了java RocketMQ快速入門基礎(chǔ)知識(shí),所以RocketMQ是站在巨人的肩膀上(kafka),又對其進(jìn)行了優(yōu)化讓其更滿足互聯(lián)網(wǎng)公司的特點(diǎn)。它是純Java開發(fā),具有高吞吐量、高可用性、適合大規(guī)模分布式系統(tǒng)應(yīng)用的特點(diǎn)。,需要的朋友可以參考下2019-06-06
Spring Validation和Hibernate Validator結(jié)合國際化代碼實(shí)例
這篇文章主要介紹了Spring Validation和Hibernate Validator結(jié)合國際化代碼實(shí)例,我們需要對請求參數(shù)進(jìn)行非空、長度、正確性進(jìn)行校驗(yàn), 本文主要講解Spring Validation 和 Hibernate Validator, 同時(shí)整合i18n(國際化)實(shí)現(xiàn)參數(shù)校驗(yàn)自動(dòng),需要的朋友可以參考下2023-10-10
(starters)springboot-starter整合阿里云datahub方式
這篇文章主要介紹了(starters)springboot-starter整合阿里云datahub方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
JAVA序列化和反序列化的底層實(shí)現(xiàn)原理解析
這篇文章主要介紹了JAVA序列化和反序列化的底層實(shí)現(xiàn)原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
淺析Spring boot 中 logback 配置<springPropert
這篇文章主要介紹了淺析Spring boot 中 logback 配置<springProperty> 讀取application.properties 中的屬性,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-02-02
Springdoc替換swagger的實(shí)現(xiàn)步驟分解
最近在spring看到的,spring要對api文檔動(dòng)手了,有些人說swagger不好用,其實(shí)也沒那么不好用,有人說代碼還是有點(diǎn)侵入性,這倒是真的,我剛試了springdoc可以說還是有侵入性但是也可以沒有侵入性,這就看你對文檔有什么要求了2023-02-02

