唯一碼碉纺,也許在開發(fā)中不常用船万,但是一旦用上往往會出現(xiàn)在核心業(yè)務(wù)里面。例如訂單號骨田,邀請碼耿导,會員卡號,消息id等等态贤。
草稿方案
1.最簡單方案舱呻,以年月日時分秒+幾位隨機數(shù)
2.如果唯一碼有長度限制那就尷尬了,例如只允許5位悠汽,這個時候降低生成唯一碼重復(fù)率就十分重要了箱吕。
生成策略
1.預(yù)生成策略,這種策略優(yōu)勢在于0重復(fù)率柿冲,特別適合短唯一碼茬高,但是預(yù)先生成就意味著占用空間。
2.實時生成策略假抄,這種策略在于節(jié)省存儲空間怎栽,但是必須使用一些經(jīng)過優(yōu)化的算法來生成唯一碼。
如何保證生成是唯一的呢宿饱?
最簡單的的熏瞄,生成之后保存下來,下次生成判斷一下是否存在即可谬以。但是在并發(fā)請求下就需要加鎖處理了强饮。所以保險起見還是用單進程單線程吧。
如果你真的要在并發(fā)下生成为黎,可以考慮利用一下數(shù)據(jù)庫胡陪,用唯一值約束檢驗一下。性能那就沒辦法保證了碍舍。
如果使用預(yù)分配策略的話,只需要內(nèi)部維護一個計數(shù)器邑雅,每次請求計數(shù)器加一片橡,然后作為下標(biāo)拿分配的唯一碼就好。計數(shù)器如何維護呢淮野,單進程單線程下程序一個變量作為計數(shù)器即可捧书。并發(fā)情況下可以考略redis的隊列吹泡,push方法可以拿到長度,或者使用數(shù)據(jù)庫的自增主鍵经瓷。
一些個人實驗過或者猜想過或者聽說過的方案
1.簡單隨機生成爆哑,依靠數(shù)據(jù)庫唯一約束,失敗則重復(fù)生成
2.預(yù)分配幾百萬個唯一碼舆吮,依靠數(shù)據(jù)庫自增主鍵作為下標(biāo)獲取
3.構(gòu)造一個唯一的URL揭朝,然后調(diào)用第三方的短網(wǎng)址生成,后面那部分可是唯一的色冀。