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

血的教訓 ,一次訂單號重復的事故我差點被開除

開發 前端
系統出現了兩個一模一樣的訂單號,訂單的內容卻不是一樣的,而且事情發生的不止一次,被老板發現之后,當月績效被扣光!

[[442441]]

本文轉載自微信公眾號「Java極客技術」,作者鴨血粉絲Tang。轉載本文請聯系Java極客技術公眾號。

一、介紹

曾經有個項目,我們線上出了一次事故,這個事故的表象大體是這樣的:

系統出現了兩個一模一樣的訂單號,訂單的內容卻不是一樣的,而且事情發生的不止一次,被老板發現之后,當月績效被扣光!

事后經過排查,產生這個問題,總結主要有兩個原因:

  • 數據庫訂單表里面,對訂單編號沒有設置唯一鍵約束
  • 生成訂單編號的時候,采用了隨機數,導致有部分單號發生了重復

針對這個問題也做了一些研究,有一些收獲想分享給大家!

本文主要以討論電商的訂單編碼規則為案例,其他類型的服務編號設計思路其實也是相似的。

不廢話,直接干貨!

訂單命名的幾種規則總結:

  • 不重復:這點我相信大家都懂,必須全局唯一
  • 安全性:訂單號需要做到不容易被人為的猜測或者推測出來,例如訂單號就是流水號的話,那么別人就很容易從訂單號推測出公司的整體運營情況。
  • 禁用隨機碼:很多人分析生成訂單號的時候,第一個念頭肯定是不重復唯一性,那么第二個念頭可能就是安全性,想要同時滿足前兩者,很容易想到使用隨機碼,隨機碼從一定程度來說,更安全、不重復性更高,但是可讀性差,有概率會發生重復。
  • 防止并發:針對系統的并發業務場景(如秒殺),需要做到并發場景下,訂單編號生成快速、不重復等要求
  • 控制位數:訂單號的位數盡量在 10 位 ~ 18 位之間。太短的情況下,如果交易量過大,很難做到防止重復,太長可讀性差、意義也不大。

二、方案實踐

上面提到了訂單編號生成的規則,那要實現這樣的規則,該如何實現會比較好呢?

下面總結幾種常見的處理方式,我們一一分析!

2.1、方案一:UUID

UUID 是Universally Unique Indentifier的縮寫,翻譯為通用唯一識別碼,顧名思義 UUID 是一個用于記錄唯一標識一條的數據,其按照開放軟件基金會(OSF)指定的標準進行計算,用到了以太網卡地址(MAC)、納秒級時間、芯片 ID 碼和許多可能的數字。

總的來說,UUID 碼由以下三部分組成:

  • 當前日期和時間
  • 時鐘序列
  • 全局唯一的 IEEE 機器識別碼(如果有網卡從網卡獲得,沒有網卡則通過其他方式獲得)

UUID 的標準形式包含 32 個 16 進制數字,以連字號分為五段,示例:00000191-adc6-4314-8799-5c3d737aa7de。

以java為例,通過以下方式即可生成:

  1. String uuid = UUID.randomUUID().toString(); 

這種方案,雖然實現簡單、方便;但是數據庫查詢效率非常差,而且內容長,在實際的項目場景開發中,一般用于于記錄用戶的手機設備ID等硬件信息!

因此不推薦采用 uuid 來生成訂單編號!

2.2、方案二:數據庫自增

所謂數據庫自增,意思是在數據庫中給某個列設置為自增列,并且給該列設置一個初始值,代碼層面無需任何特殊處理,以 Mysql 的用戶表 ID 列為例,可以通過如下方式在創建表的時候生產。

  1. CREATE TABLE `tb_user` ( 
  2.   `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
  3.   `namevarchar(20) DEFAULT NULL
  4.   PRIMARY KEY (`id`) 
  5. ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; 

這種通過數據庫自增方式實現唯一值,在單體服務下是沒有問題,但是在大流量分布式服務環境下,并發性能很低。

以后數量大的時候,需要對 mysql 進行分庫分表,此時訂單號會重復,因此不推薦采用!

2.3、方案三:雪花算法

Snowflake(中文簡稱:雪花算法) 是 Twitter 內部的一個 ID 生算法,可以通過一些簡單的規則保證在大規模分布式情況下生成唯一的 ID 號碼。其內部結構如下:

可以很清晰的看出,Snowflake 由 4個部分組成:

  • 第一部分:bit 值,為未使用的符號位
  • 第二部分:由 41 位的時間戳(毫秒)構成,它的取值是當前時間相對于某一時間的偏移
  • 第三部分:表示工作機器 id,由服務節點 id 和數據中心 id 組合而成
  • 第四部分:表示每個工作機器每毫秒生成的序列號 ID,同一毫秒內最多可生成生產 4095 個 ID。

由于在 Java 中 64bit 的整數是 long 類型,因此在 Java 中 SnowFlake 算法生成的 id 就是 long 來存儲的。

SnowFlake 算法可以保證:

  • 所有生成的 id 按時間趨勢遞增
  • 整個分布式系統內不會產生重復id(因為有服務節點 id 和數據中心 id 來做區分)

需要注意的是:

  • 在分布式環境中,5 個 bit 位的 datacenter 和 worker 表示最多能部署 31 個數據中心,每個數據中心最多可部署 31 臺節點。
  • 41 位的二進制長度最多能表示2^41 -1毫秒即 69 年,所以雪花算法最多能正常使用 69 年,為了能最大限度的使用該算法,在使用的時候,應該為其指定一個開始時間,不然會發生重復!

在高并發的環境下,Snowflake 算法可以生成全局唯一的訂單編號,但是他的長度達到21位,因此不推薦采用,但是可以用它來生成主鍵 ID,是完全沒有問題的!

2.4、方案三:分布式組件

要想在分布式環境下生成一個唯一的訂單編號,我們可以通過分布式組件的方式,來幫忙我們生成全局唯一的訂單號,例如我們可以采用 redis 分布式緩存組件中的incr命令,來幫我們生成一個全局自增長的序列號!

實現邏輯如下:

  1. //基于某個key實現自增長 
  2. String res = jedis.get(key); 
  3. if (StringUtils.isBlank(res)) { 
  4.     jedisClient.set(key, INIT_ID);//設置自增長的初始值,INIT_ID 是初始值 
  5.     jedisClient.expire(key, seconds);//設置過期時間,seconds 是多少秒過期 
  6. long orderId = jedis.incr(key);//存在就生成+1的訂單號 

這種方式生成的自增長序列號,非常的快,可以很好的滿足大流量環境下的編號要求唯一的特性!

剩下的主要工作就是我們如何去設計一個訂單號規則!

在設計規則之前,我們先來看看互聯網幾個大廠的訂單號格式。

京東商城訂單號格式:157444499

蘇寧易購訂單號格式:2000839647

凡客誠品訂單號格式:213052230059

銀泰網訂單號格式:10030522161715

小米訂單號格式:1111218032345170

我們先來分析一下凡客誠品和銀泰網的訂單號生成規則。

凡客誠品和銀泰網訂單號都含有 0522,這是因為這 2 張訂單都是2013年5月22號下的訂單。

基本猜測一下,凡客的訂單規則是:業務編碼+年的后2位+月+日+訂單數;泰網的訂單號規則:年的第三位數+業務編碼+年的后1位+月+日+訂單數;而京東商城和蘇寧易購的訂單號看不出規則。

最后我們來分析一下小米訂單號1111218032345170,可以將其分解成四個部分1——111218—03234—5170。

  • 第一部分,1 表示購買,2 表示退貨。
  • 第二部分,表示 2011 年 12 月 18 日下的單,前面兩位省掉了。
  • 第三部分,時間戳對應00:53:54,換算成秒是03234秒。
  • 最后一部分,表示在同一秒內下的第 5170 單,也就是說,小米認為,在一秒內不會超過一萬個訂單。

總結起來,小米的訂單規則是:業務編碼+年的后 2 位+月+日+秒+訂單數,固定長度為16,這種訂單號規則可以保證 100 年不會重復!

同樣的,借鑒小米的訂單號規則,我們也可以生成同樣的訂單號,實現過程如下:

  1. //獲取當前時間 
  2. Date currentTime  = new Date(); 
  3. //格式化當前時間為【年的后2位+月+日】 
  4. String originDateStr = new SimpleDateFormat("yyMMdd").format(currentTime ); 
  5. //計算當前時間走過的秒 
  6. Date startTime =  new SimpleDateFormat("yyyyMMdd").parse(new SimpleDateFormat("yyyyMMdd").format(originDate)); 
  7. long differSecond = (currentTime.getTime() - startTime.getTime()) / 1000; 
  8. //獲取【年的后2位+月+日+秒】,秒的長度不足補充0 
  9. String yyMMddSecond = originDateStr +  StringUtils.leftPad(String.valueOf(differSecond), 5, '0'); 
  10.  
  11. //獲取【業務編碼】 + 【年的后2位+月+日+秒】,作為自增key; 
  12. String prefixOrder = sourceType + "" + yyMMddSecond; 
  13. //通過key,采用redis自增函數,實現單秒自增;不同的key,從0開始自增,同時設置60秒過期 
  14. Long incrId = redisUtils.saveINCR(prefixComplaint, 60); 
  15. //生成訂單編號 
  16. String orderNo = prefixOrder + StringUtils.leftPad(String.valueOf(incrId), 4, '0'); 

此訂單編號可以保證大流量環境下全局唯一、生成速度非常的快、支持高并發環境,同時還支持按時間排序!

三、總結

通過上面的示例演示,我們可用做一個詳細的總結!

綜上所述,在大流量的環境下,我們可以通過 redis 的incr函數實現序列號自增的特性,同時搭配訂單的設計規則,從而保證高并發的環境下,訂單唯一性!

四、參考

1、如何正確設計一個訂單號??? 

2、并發下的唯一訂單號生成規則

 

責任編輯:武曉燕 來源: Java極客技術
相關推薦

2020-10-21 12:10:30

訂單號Java代碼

2021-07-01 06:58:12

高并發訂單號SCM

2024-10-14 12:05:56

2019-08-23 08:09:18

訂單號生成數據庫ID

2024-05-13 08:37:17

炫技H5UI

2020-11-18 09:56:46

Java開發代碼

2025-03-11 08:48:35

JVMOOM事故

2024-09-04 08:55:56

2025-01-02 09:06:43

2020-07-07 14:15:25

Go代碼數據

2025-09-15 07:51:35

2020-08-24 07:34:39

網絡超時請求

2021-03-05 22:41:55

CDH集群CDH集群

2025-11-13 07:46:10

2021-10-22 05:56:31

數據庫鎖表鎖定機制

2019-01-16 09:20:42

架構設計JVM FullGC宕機事故

2019-03-19 09:34:41

離職跳槽月薪

2022-07-11 13:58:14

數據庫業務流程系統

2020-11-16 12:35:25

線程池Java代碼

2023-01-16 14:49:00

MongoDB數據庫
點贊
收藏

51CTO技術棧公眾號

日韩欧美一二三四区| 亚洲乱码国产乱码精品精的特点 | 欧美调教sm| 日本一区二区免费在线| 亚洲xxxx做受欧美| 极品国产91在线网站| 天堂美国久久| 亚洲男人天堂久| 中文字幕12页| 国产激情视频在线看| 国产精品初高中害羞小美女文| 成人资源视频网站免费| 午夜久久久久久久久久影院| 欧美1区2区| 亚洲色图25p| 亚洲精品乱码久久久久久9色| 丝袜诱惑一区二区| 亚洲免费观看在线观看| 翔田千里亚洲一二三区| 天天操天天射天天| 国产一区二区三区四| 国产精品高潮在线| 国产成人在线免费观看视频| 正在播放日韩欧美一页| 国产一区二区黑人欧美xxxx| 大尺度在线观看| 国产精品99久久免费| 色婷婷综合视频在线观看| 成人免费a级片| 日本黄色片在线观看| 久久婷婷色综合| 国产伦精品一区二区三区视频免费 | 青青草精品毛片| 妺妺窝人体色www在线下载| 久久社区一区| 中文字幕九色91在线| 亚洲自拍偷拍一区二区| 99re91这里只有精品| 欧美一级生活片| 亚洲高清免费在线观看| 欧美二三四区| 欧美性猛交xxxx乱大交3| 老子影院午夜伦不卡大全| 菠萝菠萝蜜在线视频免费观看| 中文字幕免费一区| 日本精品二区| 爱久久·www| 国产日韩欧美精品一区| 欧美男人的天堂| 神马亚洲视频| 久久你懂得1024| 欧美日韩视频在线一区二区观看视频| 天堂在线资源网| 北条麻妃国产九九精品视频| 国产91亚洲精品一区二区三区| www.日韩高清| 国产成人自拍网| 不卡一区二区三区视频| 午夜久久久久久久久久| 国产成+人+日韩+欧美+亚洲| av成人午夜| 亚洲免费一级片| 9色porny自拍视频一区二区| 久久久久成人精品免费播放动漫| 偷拍25位美女撒尿视频在线观看| 久久婷婷综合激情| 五月天亚洲综合情| 日韩毛片久久久| 亚洲三级在线免费| 日韩欧美精品免费| 成人一级福利| 亚洲国产成人va在线观看天堂 | 日本成人超碰在线观看| 国产精品视频一| 国产三级漂亮女教师| 风间由美性色一区二区三区| 国偷自产av一区二区三区小尤奈| 欧美孕妇性xxxⅹ精品hd| 国产日本一区二区| 亚洲欧美影院| 免费网站在线观看人| 日韩欧美国产激情| 色播五月激情五月| 一区二区三区欧洲区| 精品偷拍一区二区三区在线看| 国产精品美女高潮无套| 亚洲精品99| 97久久精品视频| 亚洲精品国产欧美在线观看| 精品一区二区三区免费视频| 精品国产乱码一区二区三区四区| 国产乱视频在线观看| 亚洲狠狠丁香婷婷综合久久久| 免费看的黄色大片| 日本欧美在线| 日韩精品欧美国产精品忘忧草| 天堂在线中文视频| 亚洲一级电影| 国产美女久久久| 色香蕉在线视频| 亚洲欧洲www| 无码人妻丰满熟妇区96| 少妇高潮一区二区三区99| 亚洲韩国青草视频| 中文字幕电影av| 久久亚洲国产精品一区二区| 96久久精品| av播放在线| 第一福利永久视频精品| 午夜激情视频网| 欧美精品一区二区久久| 国产69精品久久久久99| 国产精品伦一区二区三区| 久久久亚洲午夜电影| 日韩精品一区二区免费| av一级久久| 尤物九九久久国产精品的特点 | 日本一区中文字幕| 国产亚洲一区在线播放| 2024最新电影在线免费观看| 欧美亚洲国产一卡| 一本色道久久综合亚洲精品图片| 女人色偷偷aa久久天堂| 国产免费久久av| www 日韩| 91久久精品一区二区三| 国产二级一片内射视频播放 | 欧美三级午夜理伦三级在线观看| 久久久精品一区| 在线播放亚洲精品| 久久精品视频网| 日本wwww视频| 日韩高清影视在线观看| 欧美第一淫aaasss性| 99热这里只有精品在线观看| 国产精品久久久久桃色tv| 成年人网站大全| 伊人精品一区| 3344国产精品免费看| 日本国产在线观看| 夜夜嗨av一区二区三区网页| 日本中文字幕精品| 牛牛国产精品| 高清av免费一区中文字幕| 97caopor国产在线视频| 欧美一区二区日韩一区二区| 四虎884aa成人精品| 极品少妇一区二区| 在线观看欧美激情| 精品欧美视频| 欧美第一黄色网| 日本高清视频免费看| 午夜精品久久久久久久久久久| 99热超碰在线| 亚洲欧美日韩国产一区| 裸模一区二区三区免费| 日韩精品麻豆| 久久精品夜夜夜夜夜久久| 国产精品嫩草影院精东| 亚洲黄色av一区| 精品少妇人妻av一区二区三区| 91久久亚洲| 青青草国产精品| 国产精品一区二区免费福利视频 | 日本高清不卡三区| 久久99国产精品二区高清软件| 日韩亚洲欧美中文高清在线| 国产高清免费av| 亚洲午夜激情网页| 欧美亚一区二区三区| 视频一区视频二区中文| 在线视频精品一区| 亚洲国产高清在线观看| 91精品国产精品| 国产福利片在线| 91精品国产91久久久久久一区二区| 欧美卡一卡二卡三| 99re成人精品视频| 91香蕉视频导航| 午夜久久久久| 欧美不卡三区| 成人在线视频www| 亚洲2020天天堂在线观看| 狠狠色伊人亚洲综合网站l| 欧美日韩日日骚| 国产亚洲色婷婷久久99精品| 久久久亚洲国产美女国产盗摄| 日韩av.com| 野花国产精品入口| 亚洲自拍偷拍二区| 国产精品网址| 91精品久久久久久久久| sm久久捆绑调教精品一区| 一区二区欧美激情| 丰满人妻av一区二区三区| 一本到一区二区三区| 精品人妻伦九区久久aaa片| 97精品久久久午夜一区二区三区| 国产一区二区在线免费播放| 亚洲私人影院| 正在播放91九色| 九一国产精品| 粉嫩av四季av绯色av第一区| 日韩成人精品一区二区三区| 91精品国产91久久久久久久久| 日韩毛片久久久| 亚洲欧美中文字幕| 亚洲伦理在线观看| 欧美日韩激情一区二区三区| 国产午夜性春猛交ⅹxxx| 一区二区三区精品在线| 久久日免费视频| 91一区一区三区| 久久久久亚洲av无码网站| 青娱乐精品在线视频| 99热在线这里只有精品| 欧美 日韩 国产一区二区在线视频| 色中色综合成人| 日韩在线影视| 国产欧美日本在线| 亚洲日本视频在线| 亚洲一区二区三区xxx视频| 国产精品亚洲d| 欧美中文字幕视频| 国产高清自产拍av在线| 久久久久久久久爱| 肉肉视频在线观看| 久久色在线播放| 免费大片在线观看www| 在线亚洲国产精品网| 你懂的在线观看| 亚洲精品永久免费| 天天舔天天干天天操| 精品处破学生在线二十三| 国产免费无遮挡| 欧美一区二区三区小说| 国产视频在线观看免费| 欧美剧情片在线观看| 在线不卡免费视频| 91国产福利在线| 中文精品久久久久人妻不卡| 色久综合一二码| 久久久久久在线观看| 一本久久a久久免费精品不卡| 免费日韩一级片| 精品欧美激情精品一区| wwwwww国产| 色综合久久久久久久久| 日韩精品成人免费观看视频| 在线一区二区三区四区五区 | 国产高清在线精品| 日本xxxx免费| 成人久久久精品乱码一区二区三区| av地址在线观看| 99re热视频精品| 实拍女处破www免费看| 欧美国产1区2区| 日本不卡一二区| 亚洲自拍欧美精品| 国产精品111| 欧美视频裸体精品| 亚洲高清视频免费观看| 欧美精品色一区二区三区| 国产美女永久免费| 亚洲第一av在线| 免费av在线电影| 色琪琪综合男人的天堂aⅴ视频| 在线观看免费黄视频| 久久精品视频va| 国产精品国精产品一二| 欧美专区日韩视频| 成人精品国产| 粉嫩精品一区二区三区在线观看 | 精品国产区一区二区三区在线观看| 黄色精品在线观看| 美女少妇精品视频| 成年人黄色大片在线| 国产精品久久久久久久久久免费 | 亚洲av无码一区二区三区在线| 夜夜嗨av一区二区三区| 亚洲欧美一二三区| 欧美一级欧美三级| 欧美视频综合| 久久亚洲一区二区三区四区五区高| 黑人极品ⅴideos精品欧美棵| 日本精品性网站在线观看| 欧美在线se| 精品一区二区日本| 99精品综合| 国产精品va无码一区二区| 蜜臀va亚洲va欧美va天堂| 亚洲乱妇老熟女爽到高潮的片 | 亚洲第一av在线| 天堂аⅴ在线地址8| 91大神福利视频在线| 亚洲影视资源| 欧美日韩精品免费看| 亚洲精品成人影院| 激情网站五月天| 国产福利91精品一区二区三区| 国产精品一二三区在线观看| 亚洲伊人色欲综合网| 在线免费看av的网站| 日韩国产欧美区| 女同一区二区免费aⅴ| 国产精品揄拍一区二区| 亚洲三级网址| 欧美精品卡一卡二| 经典一区二区三区| 精品人妻中文无码av在线| 午夜欧美一区二区三区在线播放| 中文字幕av无码一区二区三区| 精品久久久久久久久久久院品网| 自拍视频在线网| 欧美怡春院一区二区三区| 97se亚洲国产一区二区三区| 国产四区在线观看| 日韩高清在线不卡| 少妇户外露出[11p]| 亚洲一区二区av电影| 精品国产18久久久久久| 日韩最新在线视频| 精品123区| 欧美亚洲国产免费| 亚洲在线网站| 日韩av手机在线播放| 亚洲一区二区欧美日韩| 99国产精品99| 中文日韩电影网站| 3d欧美精品动漫xxxx无尽| 欧美另类一区| 丝袜诱惑亚洲看片| 熟女高潮一区二区三区| 精品国产乱码久久久久久天美| 亚洲av综合色区无码一二三区| 久久天天躁狠狠躁夜夜爽蜜月| 国产精品66| 一区二区在线高清视频| 久久69国产一区二区蜜臀| 中文字幕91视频| 欧美日韩国产综合草草| 日韩伦理在线电影| 91久久精品国产91久久性色| 99精品美女| 在线成人免费av| 亚洲精品久久久蜜桃| 国产黄a三级三级三级| 欧美肥老妇视频| 福利片在线一区二区| 欧美深夜福利视频| 91亚洲国产成人精品一区二三| 在线观看亚洲欧美| 亚洲人精品午夜在线观看| 欧美在线va视频| 亚洲一区二区三区午夜| 国产乱码精品一品二品| 久久久精品国产sm调教| 亚洲国产精品视频在线观看| 伊人久久国产| 一区二区三区av在线| 国产精品亚洲第一区在线暖暖韩国| 免费一级片视频| 日韩麻豆第一页| 福利一区二区三区视频在线观看| 久久免费看毛片| 成人免费高清视频| 精品国产午夜福利| 日韩视频中文字幕| 亚洲日本va| 无码日韩人妻精品久久蜜桃| 亚洲色图欧美偷拍| 四虎免费在线观看| 国产精品国产亚洲伊人久久 | 日韩高清一级| 无尽裸体动漫2d在线观看| 一区二区三区精品视频| 免费福利在线视频| 成人欧美一区二区三区在线| 日韩视频一区| 欧美色图17p| 精品国产髙清在线看国产毛片| 欧美羞羞视频| 日本三日本三级少妇三级66| 91在线国产观看| 97超视频在线观看| 97国产一区二区精品久久呦| 大胆日韩av| 亚洲激情 欧美| 欧美日本在线视频| 91老司机福利在线| 午夜精品亚洲一区二区三区嫩草| 成人一级片网址| 国产一区二区三区四区视频| 91国内产香蕉| 亚洲天天影视网| 中文字幕在线观看免费高清 | 成人手机在线免费视频| 555www色欧美视频| 不卡av影片| 日韩人妻无码精品久久久不卡|