精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

淺談訂單號生成的設計方案

開發 開發工具
今天討論分享下訂單號生成的簡單實現方案,為實際場景中需要用到訂單號生成服務提供解決思路。

今天討論分享下訂單號生成的簡單實現方案,為實際場景中需要用到訂單號生成服務提供解決思路。

[[274637]]

最簡單的方式

基于數據庫 auto_increment_increment 來獲取 ID。首先在數據庫中創建一張 sequence 表,其中 seq_name 用以區分不同業務標識,從而實現支持多種業務場景下的自增 ID,current_value 為當前值,_increment 為步長,可支持分布式數據庫的哈希策略。

  1. CREATE TABLE `sequence` ( 
  2. `seq_name` varchar(200) NOT NULL, 
  3. `current_value` bigint(20) NOT NULL, 
  4. `_increment` int(4) NOT NULL, 
  5.   PRIMARY KEY (`seq_name`) 
  6. ENGINE=InnoDB DEFAULT CHARSET=utf8 

通過 SELECT LAST_INSERT_ID() 方法,更新 sequence 表,進行 ID 遞增,并同時獲取上次更新的值。這里注意,current_value = LAST_INSERT_ID(current_value + _increment) 將更新的 ID 賦值給了 LAST_INSERT_ID,否則返回的將是行 id。

  1. <insert timeout="30" id="update" parameterType="Seq"> 
  2.     UPDATE sequence 
  3.     SET 
  4.     current_value = LAST_INSERT_ID(current_value + _increment) 
  5.     WHERE 
  6.     seq_name = #{seqName} 
  7. <selectKey resultType="long" keyProperty="id" order="AFTER"> 
  8.         <![CDATA[SELECT LAST_INSERT_ID() ]]> 
  9. </selectKey> 
  10. </insert> 

最后 Dao 提供服務,需要提醒的是注意數據庫的事務隔離級別,如果將 getSeq() 方法放到 Service 中有事務的方法里,將出現問題,因為數據庫事務開啟會創建一張視圖,在事務沒有提交之前,更新的 ID 還沒有被提交到數據庫中,這在多線程并發操作的情況下,如果事務里的其他方法導致性能慢了,可能出現兩個請求獲取到相同的 ID,所以解決方法一是不要將 getSeq() 方法放到有事務的方法里,另一種就是將 getSeq() 方法的隔離界別為 PROPAGATION_REQUIRES_NEW,實現開啟新事務,外層事務不會影響內部事務的提交。

  1. @Autowired 
  2. private SeqDao seqDao; 
  3.  
  4. @Autowired 
  5. private PlatformTransactionManager transactionManager; 
  6.  
  7. @Override 
  8. public long getSeq(final String seqName) throws Exception { 
  9.     TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager); 
  10. // 事務行為,獨立于外部事物獨立運行 
  11.     transactionTemplate 
  12.             .setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); 
  13. return (Long) transactionTemplate.execute(new TransactionCallback() { 
  14. public Object doInTransaction(TransactionStatus status) { 
  15. try { 
  16.                 Seq seq = new Seq(); 
  17.                 seq.setSeqName(seqName); 
  18. if (seqDao.update(seq) == 0) { 
  19. throw new RuntimeException("seq update failure."); 
  20.                 } 
  21. return seq.getId(); 
  22.             } catch (Exception e) { 
  23. throw new RuntimeException("seq update error."); 
  24.             } 
  25.         } 
  26.     }); 

稍復雜一點的方法

上述的方法的問題,想必大家都知道,就是每次獲取 ID 都要調用數據庫,在高并發的情況下會對數據庫產生極大的壓力,我們的改進方法也很簡單,就是一次申請一個段的 ID,然后發到內存里,每次獲取 ID 先從內存里取,當內存中的 ID 段全部被獲取完畢,則再一次調用數據庫重新申請一個新的 ID 段。同樣有數據庫表的設計,通過 Name 區分業務,用 ID 標明已經申請到的最大值。當然如果是分布式架構,也可以通過增加步長屬性來實現。

  1. CREATE TABLE `sequence_value` ( 
  2. `Name` varbinary(50) DEFAULT NULL, 
  3. `ID` int(11) DEFAULT NULL 
  4. ENGINE = InnoDB DEFAULT CHARSET = utf8 

Step 是 ID 段的內存對象,有兩個屬性,其中 currentValue 當前的使用到的值,endValue 是內存申請的最大值。

  1. class Step { 
  2. private long currentValue; 
  3. private long endValue; 
  4.  
  5.     Step(long currentValue, long endValue) { 
  6. this.currentValue = currentValue; 
  7. this.endValue = endValue; 
  8.     } 
  9.  
  10. public void setCurrentValue(long currentValue) { 
  11. this.currentValue = currentValue; 
  12.     } 
  13.  
  14. public void setEndValue(long endValue) { 
  15. this.endValue = endValue; 
  16.     } 
  17.  
  18. public  long incrementAndGet() { 
  19. return ++currentValue; 
  20.     } 

代碼的實現稍微復雜一點,獲取 ID 會根據業務標識 sequencename,先從內存獲取 Step 的 ID 段,如果為 null,則從數據庫中讀取當前最新的值,并根據步長計算 Step,然后返回請求 ID。如果從內存中直接獲取到 Step,則直接取 ID,并對 currentValue 進行加一。當 currentValue 的值超過 endValue 時,則更新數據庫的 ID,重新計算 Step。

  1. private Map<String,Step> stepMap = new HashMap<String, Step>(); 
  2.  
  3. public synchronized long get(String sequenceName) { 
  4.     Step step = stepMap.get(sequenceName); 
  5. if(step ==null) { 
  6.         step = new Step(startValue,startValue+blockSize); 
  7.         stepMap.put(sequenceName, step); 
  8.     } else { 
  9. if (step.currentValue < step.endValue) { 
  10. return step.incrementAndGet(); 
  11.         } 
  12.     } 
  13. if (getNextBlock(sequenceName,step)) { 
  14. return step.incrementAndGet(); 
  15.     } 
  16. throw new RuntimeException("No more value."); 
  17.  
  18. private boolean getNextBlock(String sequenceName, Step step) { 
  19. // "select id from sequence_value where name = ?"; 
  20.     Long value = getPersistenceValue(sequenceName); 
  21. if (value == null) { 
  22. try { 
  23. // insert into sequence_value (id,name) values (?,?) 
  24. value = newPersistenceValue(sequenceName); 
  25.         } catch (Exception e) { 
  26. value = getPersistenceValue(sequenceName);  
  27.         } 
  28.     } 
  29. // update sequence_value set id = ?  where name = ? and id = ? 
  30.     boolean b = saveValue(value,sequenceName) == 1; 
  31. if (b) { 
  32.         step.setCurrentValue(value); 
  33.         step.setEndValue(value+blockSize); 
  34.     } 
  35. return b; 

使用該方法獲取 ID 可以減少對數據庫的訪問量,以降低數據庫的壓力,但是同樣需要注意,獲取 ID 同樣關注數據庫事務問題,因為當系統重啟的時候,stepMap 為 null,所以會取數據庫查詢當前 ID,更計算更新 Step,然后更新數據庫的 ID。如果該方法被放到數據庫事務里,由于其他方法性能慢了,導致查詢之后沒有及時更新,并發情況下另一個線程查詢的時候,可能會獲取到該線程未提交的 ID,因而出現兩個線程獲取到相同的 ID 問題。

本文小結

訂單號生成是一個非常簡單的功能,但是在高并發的場景下,高性能和高可用就成為了需要關注的要點。所以,實際工作中的每一個小細節都值得我們去深思。

【本文是51CTO專欄作者張開濤的原創文章,作者微信公眾號:開濤的博客,id:kaitao-1234567】

戳這里,看該作者更多好文

 

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2019-08-15 11:11:38

Java數據庫設計

2021-07-01 06:58:12

高并發訂單號SCM

2025-01-02 09:06:43

2025-11-13 07:46:10

2024-10-14 12:05:56

2024-09-04 08:55:56

2020-10-21 12:10:30

訂單號Java代碼

2021-12-28 06:55:09

事故訂單號績效

2025-03-03 00:45:00

2024-10-17 08:26:53

ELKmongodb方案

2010-09-08 16:17:37

SIP協議棧

2022-07-05 09:38:47

模型RBACABAC

2012-07-11 10:49:34

鮑爾默Surface

2009-10-12 16:50:00

2009-10-19 13:50:57

布線設計方案

2012-08-17 11:01:52

設計方案

2010-02-25 15:30:47

SDRAMWindows CE

2017-07-10 17:25:40

開發單號高可用

2009-10-19 14:39:10

2019-03-13 16:09:47

VMware虛擬化服務器
點贊
收藏

51CTO技術棧公眾號

国产一区高清| 成人av免费| 国产精品夜夜夜| 在线观看日韩视频| 激情久久综合网| 久久久久黄久久免费漫画| 99久久精品99国产精品| 国产精品日日做人人爱| 久久中文字幕在线观看| 免费精品国产| 欧美不卡一区二区三区| 老司机午夜av| 第一中文字幕在线| 欧美国产激情二区三区| 国产精品12| 一级黄色片免费看| 亚洲另类黄色| 欧美成人午夜视频| 性猛交ⅹxxx富婆video | 在线欧美日韩国产| 日韩视频免费播放| 男人天堂手机在线| 久久久久久久久久看片| 电影午夜精品一区二区三区| 免费精品一区二区| 婷婷在线免费视频| 最近中文字幕免费mv2018在线| 成人免费视频播放| 国产欧美亚洲视频| 日韩av大片在线观看| 欧美有码视频| 中文字幕日韩欧美| 男生草女生视频| 国产极品模特精品一二| 日韩一级二级三级| 向日葵污视频在线观看| 亚洲人成午夜免电影费观看| 一区二区在线观看免费视频播放| 偷拍视频一区二区| 蜜桃视频在线观看网站| 99久久精品国产导航| 99在线国产| 国产后入清纯学生妹| 免费久久99精品国产| 国产成人精品免费视频| 国产成人免费看| 亚洲毛片视频| 国内精品免费午夜毛片| 九九视频免费在线观看| 五月激情久久久| 日韩视频免费观看| 亚洲人做受高潮| 99久久这里只有精品| 少妇av一区二区三区| 国产激情av在线| 欧美亚洲高清| 夜夜嗨av一区二区三区四区| 国产高潮呻吟久久| 精品国产一区一区二区三亚瑟| 精品亚洲aⅴ在线观看| 国产精品无码一区二区三区免费 | 欧美成人一品| 欧美成人中文字幕在线| 国产亚洲第一页| 亚洲大胆视频| 欧美整片在线观看| 日韩三级一区二区| 美女爽到高潮91| 91久久精品一区| www.蜜桃av.com| 成人网男人的天堂| 久久综合狠狠综合久久综青草| 欧美日本韩国一区二区| 国产欧美va欧美不卡在线 | 你懂的视频一区二区| 九九精品在线视频| 日韩三级小视频| 丝袜美腿成人在线| 91久热免费在线视频| 午夜精品在线播放| 久久久久久麻豆| 中文字幕中文字幕99| 青草在线视频| 日韩欧美亚洲成人| 91视频这里只有精品| 2020最新国产精品| 亚洲三级免费看| 女教师淫辱の教室蜜臀av软件| 午夜久久福利| 欧美在线视频观看免费网站| 亚洲天堂网在线视频| 国产成人亚洲综合a∨猫咪| 好吊妞www.84com只有这里才有精品 | 久久99青青精品免费观看| 欧美日韩中文视频| 欧美亚洲自偷自偷| 91久久久久久久一区二区| 丰满人妻一区二区三区无码av | 永久免费毛片在线观看| 影视一区二区| 日韩av免费在线播放| 99久久久国产精品无码网爆| 本田岬高潮一区二区三区| 亚洲乱码一区二区三区三上悠亚| 黑人玩欧美人三根一起进| 欧美色综合网站| 奇米777第四色| 99精品视频在线| 欧美在线一区二区三区四| a天堂视频在线| 国产亚洲欧美一级| 欧美视频在线观看视频| 四虎国产精品免费久久5151| 亚洲精品美女视频| 一区二区三区影视| 丝袜美腿一区二区三区| 精品一区日韩成人| 手机av免费在线| 欧美日韩高清在线播放| 偷拍女澡堂一区二区三区| 欧美另类女人| 91精品中国老女人| 岛国在线大片| 日韩欧美主播在线| 国产精品扒开腿做爽爽爽a片唱戏| 天天做天天爱天天爽综合网| 国产精品久久久久一区二区| 视频三区在线观看| 亚洲成人1区2区| 蜜臀aⅴ国产精品久久久国产老师| 久久福利综合| 国产精品27p| 黄色在线网站| 日韩人在线观看| 久久亚洲AV成人无码国产野外| 韩国自拍一区| 超碰97网站| 女囚岛在线观看| 日韩一二三区视频| 欧洲猛交xxxx乱大交3| 狠狠色丁香婷综合久久| 麻豆中文字幕在线观看| **精品中文字幕一区二区三区| 在线亚洲欧美视频| 欧美在线视频精品| 国产欧美日韩不卡免费| 91激情视频在线| 欧美精选视频在线观看| 国产精品欧美亚洲777777| 天堂成人在线视频| 黄色一区二区三区| www.色天使| 三级不卡在线观看| 性欧美.com| 日韩黄色三级| 欧美成人性色生活仑片| 成人激情四射网| 亚洲国产色一区| 亚洲精品乱码久久久久久久| 免费日韩视频| 午夜免费电影一区在线观看| 国产激情久久| 日韩在线观看高清| www.国产.com| 欧美日韩免费区域视频在线观看| 扒开jk护士狂揉免费| 日韩中文字幕av电影| 一区二区视频国产| 一区二区日韩| 26uuu亚洲国产精品| 国产福利在线观看| 69堂精品视频| av资源吧首页| 久久久亚洲精品一区二区三区| 三级在线视频观看| 欧美成人久久| 久久精品国产精品青草色艺| 国产成人精选| 欧美日韩高清在线观看| 艳母动漫在线看| 欧美日韩国产一级二级| 久久久精品99| 久久人人爽人人爽| 国产美女视频免费看| 亚洲福利免费| 亚洲日本理论电影| 国产精品久久久网站| 国产精品va在线播放| 色a资源在线| 国产午夜精品美女视频明星a级| 一级黄色片在线观看| 图片区小说区区亚洲影院| 国产不卡在线观看视频| 成人毛片在线观看| 在线看的黄色网址| 亚洲激情黄色| 一区二区精品免费视频| 加勒比久久高清| 91在线免费视频| 亚洲电影观看| 欧美激情欧美狂野欧美精品| 春暖花开成人亚洲区| 精品不卡在线视频| 国产乱码久久久久| 色综合久久中文字幕综合网| 欧美又粗又大又长| 亚洲欧洲一区二区在线播放| 国产呦小j女精品视频| 粉嫩高潮美女一区二区三区| 一道本在线免费视频| 性色一区二区| 91黄色在线看| 欧美精品国产| 老司机av福利| 欧美日韩在线播放视频| 精品国产91亚洲一区二区三区www| 成人精品视频在线观看| 国产精品久久97| 一区二区三区短视频| 欧美极品少妇全裸体| av片在线观看永久免费| 中文字幕日韩在线观看| 国产乱理伦片a级在线观看| 亚洲二区中文字幕| www.成人精品| 日韩西西人体444www| 一级特黄aa大片| 欧洲一区在线电影| av网站中文字幕| 狠狠躁夜夜躁人人躁婷婷91 | 黄在线免费看| 深夜成人在线观看| av基地在线| 国产亚洲综合久久| 国产一级在线| 国产一区二区三区欧美| 欧洲免费在线视频| 亚洲欧美日韩国产精品| 日本一区高清| 亚洲欧美日韩一区在线| 九色网友自拍视频手机在线| 亚洲欧美精品一区二区| 男人的天堂在线| 亚洲欧美中文另类| 欧美精品a∨在线观看不卡| 日韩久久免费电影| 青草久久伊人| 国产一区二区美女视频| 成人高清免费观看mv| 永久免费看mv网站入口亚洲| 3d成人动漫在线| 日韩在线视频免费观看| 免费大片黄在线| 色综合视频网站| 国模私拍视频在线播放| 亚州成人av在线| 在线免费三级电影网站| 国产成人午夜视频网址| 91超碰碰碰碰久久久久久综合| 国产精品一区久久| 国产精一区二区| av一区二区三区免费| 精品国产午夜肉伦伦影院| 久久亚洲高清| 成人在线免费观看视频| 国产高清精品软男同| 欧美在线1区| 国产精品无码一区二区在线| 天堂一区二区在线| 天天操狠狠操夜夜操| 成人综合婷婷国产精品久久 | 九九综合九九| 一区二区视频在线观看| 国内久久视频| 成人在线看视频| 国产在线视视频有精品| 亚洲少妇中文字幕| 国产亚洲精品福利| 青青草原在线免费观看| 欧美日韩国产精品一区二区不卡中文| 蜜臀精品一区二区三区| 91精品国产综合久久久久久久久久| 亚洲精品福利网站| 亚洲天堂av网| 在线观看操人| 国产成人久久久精品一区| www.久久久久爱免| 久久久久一区二区| 羞羞色午夜精品一区二区三区| 黄色一级片在线看| 蜜臂av日日欢夜夜爽一区| 日本wwwwwww| 中日韩免费视频中文字幕| 国产在线视频你懂的| 欧美在线色视频| 污视频在线免费观看| 久久精品福利视频| 中老年在线免费视频| 91九色偷拍| gogogo高清在线观看一区二区| 男人的天堂avav| 美女一区二区三区| 中文人妻一区二区三区| 亚洲综合一区在线| 亚洲视频在线观看一区二区 | 99国精产品一二二线| 欧美三级美国一级| 国产精品无码一区二区在线| 国产在线播精品第三| a天堂中文字幕| 亚洲综合免费观看高清在线观看| 中文字幕777| 日韩精品视频中文在线观看| 在线电影福利片| 91精品在线影院| 日本电影一区二区| av免费中文字幕| 成人一区二区三区视频 | 亚洲3atv精品一区二区三区| 一级aaaa毛片| 伊人久久免费视频| sis001欧美| 久久99久久99精品蜜柚传媒| 亚洲无吗在线| 香蕉视频在线观看黄| 国产精品久久久久一区| 无码人妻久久一区二区三区| 日韩国产欧美精品一区二区三区| 羞羞电影在线观看www| 成人午夜高潮视频| 欧美freesextv| 手机在线成人免费视频| 久久精品这里都是精品| 伊人手机在线视频| 国产视频在线观看一区二区| 色综合桃花网| 蜜桃网站成人| 久久一本综合频道| 88久久精品无码一区二区毛片| 欧美日韩国产综合视频在线观看中文 | 欧美r级电影| 一道本视频在线观看| 久久综合色综合88| 久久国产视频精品| 亚洲欧美在线播放| 欧美日韩视频网站| 视频在线观看成人| 免费观看久久久4p| 91狠狠综合久久久| 欧美一区二区三区不卡| 欧美伦理免费在线| 国产欧美一区二区视频| 国产精品一页| 波多野在线播放| 欧美日韩另类国产亚洲欧美一级| 成人免费高清在线播放| 国产久一一精品| 亚洲天堂一区二区三区四区| 一个人看的视频www| 亚洲国产综合色| 人成免费电影一二三区在线观看| 日韩美女主播视频| 久久高清免费| 潘金莲一级淫片aaaaa| 五月天亚洲精品| 国内精品一区视频| 成人网在线视频| 亚洲每日更新| 能直接看的av| 欧美成人精品1314www| 国产在线精彩视频| 日本精品一区二区| 国产呦萝稀缺另类资源| 日本网站在线免费观看| 国产亚洲精品美女久久久| av在线国产精品| 久久久久久久中文| 国产精品免费人成网站| 亚洲爆乳无码一区二区三区| 欧美在线亚洲在线| 亚洲天天影视网| 精品少妇一区二区三区免费观| 欧美日韩精品欧美日韩精品| 人妖欧美1区| 欧美亚洲爱爱另类综合| 国产精品亚洲人在线观看| 国产又黄又粗又爽| 久久精品人人爽| 亚洲ab电影| 性色av浪潮av| 日韩欧美高清视频| 中文字幕在线观看网站| 欧美精品尤物在线| 国产精品一区二区x88av| 五月婷婷中文字幕| 九九精品视频在线| av永久不卡| 香蕉视频黄色在线观看| 欧美一区二区福利在线| 日韩伦理三区|