網際網路快速發展的今天,分布式應用系統已經見怪不怪,在分布式系統中,我們需要各種各樣的id,既然是id那麼必然是要保證全域性唯一,除此之外,不同的業務還需要不同的特性,比如像併發巨大的業務要求id生成效率高,吞吐大;比如某些銀行類業務,需要按每日日期制定交易流水號;又比如我們希望使用者的id是隨機的,無序的,純數字的,且位數長度是小於10位的。等等,不同的業務場景需要的id特性各不一樣,於是,衍生了各種id生成器。本文講的訂單號就是其中一種業務id,下面結合訂單業務需求,介紹訂單號的生成策略。
特徵:全域性唯一,不重複;安全性;效能;id生成效率高。訂單號生策略。
支付中心多台部署,能夠保證訂單id唯一麼?
業務需求:
1)訂單號不能重複
2)訂單號沒有規則,即編碼規則不能加入任何和公司運營相關的資料,外部人員無法通過訂單id猜測到訂單量。不能被遍歷。
3)訂單號長度固定,且不能太長
4)易讀,易溝通,不要出現數字字母換亂現象
5)生成耗時(生成效率高低)
關於訂單號的生成,一些比較簡單的方案:
1、資料庫自增長id
優勢:無需編碼
缺陷:1)大表不能做水平分表,否則插入刪除時容易出現問題(單表處理,不能分表)。
2)高併發下插入資料需要加入事務機制
3)在業務操作父、子表(關聯表)插入時,先要插入父表,再插入子表;
2、時間戳+隨機數
優勢:編碼簡單
缺陷:隨機數存在重複問題,即使在相同的時間戳下。每次插入資料庫前需要校驗下是否已經存在相同的數值。(每次校驗是否存在該訂單號,不存在才能插入,同一張表)
3、時間戳+會員id
優勢:同一時間,乙個使用者不會存在兩張訂單
缺陷:會員id也會透露運營資料,雞生蛋,蛋生雞的問題
例如:s+yymmddhhmmss+math.abs(memberid.hashcode());[說明memberid為uuid的,string的hashcode唯一,而hashcode可能為負數] 雜湊值長度不同。
4、uuid
優勢:簡單。劣勢:使用者不友好,索引關聯效率較低。
uuid全稱:universally unique identifier,即通用唯一識別碼。
uuid是由一組32位數的16進製制數字所構成,所以理論上uuid的總數為16^32=2^128,約等於3.4*10^38。也就是說每納秒產生1兆個uuid,要花100億年才會將所有uuid用完。
uuid的標準形式包含32個16進製制數字,以連字型大小分為五段,形式為8-4-4-4-12的32個字元,如:550e8400-e19b-41d4-a716-446655440000。
5、twitter的snowflake
twitter-snowflake演算法產生的背景相當簡單,為了滿足twitter每秒上萬條訊息的請求,每條訊息都必須分配一條唯一的id,這些id還需要一些大致的順序(方便客戶端排序),並且在分布式系統中不同機器產生的id必須不同.snowflake演算法核心把時間戳,工作機器id,序列號(毫秒級時間41位+機器id 10位+毫秒內序列12位)組合在一起。
除了最高位bit標記為不可用以外,其餘三組bit佔位均可浮動,看具體的業務需求而定。預設情況下41bit的時間戳可以支援該演算法使用到2023年,10bit的工作機器id可以支援1023臺機器,序列號支援1毫秒產生4095個自增序列id。
時間戳+機器id+序列號。
snowflake演算法是一款本地生成的(id生成過程不依賴任何中介軟體,無網路通訊),保證id全域性唯一,並且id總體有序遞增,效能每秒生成300w+。 總體有序遞增。
此方法可能存在id重複的問題,謹慎使用
stringbuilder idbuilder = new stringbuilder();
system.out.println(idbuilder.tostring());
string useridstr = "123456789".tostring();
if (useridstr.length() <= 4) else
random random = new random();
int randompart = random.nextint(99) + 1;
if (randompart < 10)
system.out.println( long.parselong(idbuilder.tostring()));
高併發情況下扣除庫存鎖表情況
toc 1.鎖表情景 查詢條件沒有索引時 總結起來就是兩個嚴重問題 1.扣庫存時沒走索引 2.在事務中,調第三方介面 sql create table gap id int,age int,primary key id select from gap insert into test gap id ...
併發情況下synchronized死鎖
存在缺陷的 public class datapropertyidandnamerepositoryimpl integer standardid 0 mappropertyidmap propertyidlocalcache.get dataid if propertyidmap null ret...
併發情況下synchronized死鎖
存在缺陷的 public class datapropertyidandnamerepositoryimpl integer standardid 0 mappropertyidmap propertyidlocalcache.get dataid if propertyidmap null ret...