Springboot MongoDB實(shí)現(xiàn)自增序列的項(xiàng)目實(shí)踐
在某些特定的業(yè)務(wù)場景下,會需要使用自增的序列來維護(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)文章
SpringBoot中的application.properties無法加載問題定位技巧
這篇文章主要介紹了SpringBoot中的application.properties無法加載問題定位技巧,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05【Java IO流】字節(jié)流和字符流的實(shí)例講解
下面小編就為大家?guī)硪黄綣ava IO流】字節(jié)流和字符流的實(shí)例講解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-09-09idea如何關(guān)閉頁面顯示的瀏覽器圖標(biāo)
這篇文章主要介紹了idea如何關(guān)閉頁面顯示的瀏覽器圖標(biāo)問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07java int類型二維數(shù)組實(shí)現(xiàn)“楊輝三角”的完整實(shí)例
這篇文章主要給大家介紹了關(guān)于java int類型二維數(shù)組實(shí)現(xiàn)“楊輝三角”的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12