Springboot MongoDB實(shí)現(xiàn)自增序列的項(xiàng)目實(shí)踐
在某些特定的業(yè)務(wù)場(chǎng)景下,會(huì)需要使用自增的序列來(lái)維護(hù)數(shù)據(jù),目前項(xiàng)目中因?yàn)槭褂肕ongoDB,顧記錄一下如何使用MongoDB實(shí)現(xiàn)自增序列。
MongoDB自增序列原理
MongoDB本身不具有自增序列的功能,但是MongoDB的$inc操作是具有原子性的,因?yàn)椴僮鞯脑有裕敲淳涂梢酝ㄟ^(guò)$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 {
/**
* 圖書(shū)
*/
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)建查詢對(duì)象
? ? ? ? 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();
? ? }
}定義測(cè)試類
@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)過(guò)測(cè)試100個(gè)并發(fā)下沒(méi)有發(fā)現(xiàn)重復(fù)id的產(chǎn)生,但是還是建議使用MongoDB自己的Id生成策略,畢竟MongoDB作為非關(guān)系型數(shù)據(jù)庫(kù),如果維護(hù)一個(gè)自增序列,性能上肯定沒(méi)有ObjectId好,而且分片情況下需要自己校驗(yàn)自增序列的唯一性,當(dāng)然在某些特殊的業(yè)務(wù)場(chǎng)景下必須要使用自增序列的,也屬于正常。
到此這篇關(guān)于Springboot MongoDB實(shí)現(xiàn)自增序列的項(xiàng)目實(shí)踐的文章就介紹到這了,更多相關(guān)Springboot MongoDB自增序列內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot中的application.properties無(wú)法加載問(wèn)題定位技巧
這篇文章主要介紹了SpringBoot中的application.properties無(wú)法加載問(wèn)題定位技巧,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
【Java IO流】字節(jié)流和字符流的實(shí)例講解
下面小編就為大家?guī)?lái)一篇【Java IO流】字節(jié)流和字符流的實(shí)例講解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09
idea如何關(guān)閉頁(yè)面顯示的瀏覽器圖標(biāo)
這篇文章主要介紹了idea如何關(guān)閉頁(yè)面顯示的瀏覽器圖標(biāo)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
springboot打jar包之后下載文件的路徑問(wèn)題
這篇文章主要介紹了springboot打jar包之后下載文件的路徑問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
java int類型二維數(shù)組實(shí)現(xiàn)“楊輝三角”的完整實(shí)例
這篇文章主要給大家介紹了關(guān)于java int類型二維數(shù)組實(shí)現(xiàn)“楊輝三角”的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12

