Springboot MongoDB實現(xiàn)自增序列的項目實踐
在某些特定的業(yè)務場景下,會需要使用自增的序列來維護數(shù)據(jù),目前項目中因為使用MongoDB,顧記錄一下如何使用MongoDB實現(xiàn)自增序列。
MongoDB自增序列原理
MongoDB本身不具有自增序列的功能,但是MongoDB的$inc操作是具有原子性的,因為操作的原子性,那么就可以通過$inc序列+1的值作用本次序列,實現(xiàn)自增序列。
實現(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) { ? ? ? ? //構建查詢對象 ? ? ? ? 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實現(xiàn)自增序列是基于MongoDB的$inc操作指令,經過測試100個并發(fā)下沒有發(fā)現(xiàn)重復id的產生,但是還是建議使用MongoDB自己的Id生成策略,畢竟MongoDB作為非關系型數(shù)據(jù)庫,如果維護一個自增序列,性能上肯定沒有ObjectId好,而且分片情況下需要自己校驗自增序列的唯一性,當然在某些特殊的業(yè)務場景下必須要使用自增序列的,也屬于正常。
到此這篇關于Springboot MongoDB實現(xiàn)自增序列的項目實踐的文章就介紹到這了,更多相關Springboot MongoDB自增序列內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot中的application.properties無法加載問題定位技巧
這篇文章主要介紹了SpringBoot中的application.properties無法加載問題定位技巧,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05java int類型二維數(shù)組實現(xiàn)“楊輝三角”的完整實例
這篇文章主要給大家介紹了關于java int類型二維數(shù)組實現(xiàn)“楊輝三角”的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-12-12