凡事涉及到高效能貌似都是高大上的東西,所以嘛我也試試;其實這個時間戳id的生成主要為了解決我們公司內部的券號生成,估計有小夥伴認為券號生成有這麼麻煩嘛,搞個自增id完全可以用起來,或者時間取毫微公尺時間戳等。
如果以上真是這樣簡單的話,那我要說道說道;首先自增id資源耗盡的時候,特別禮券號生成的越頻繁,畢竟bigint也有耗盡那天(當然如果有更長數字字段就是慢慢耗唄),而且依靠資料庫進行被動生成,在有些業務上比較軟肋;我還有乙個同事說搞一張表定時去自增生成id,這樣就能隨時取已經存在的id資源資料,我只能說這是一種笨辦法,而且你都不知道外部業務對券號的需要量有多少,萬一立馬要個1000萬,你來得及?
還有就是毫微公尺時間戳也是會出問題,因為在多併發請求下也會大概率出現同樣id,大家不信可以去試試,想想我們的cpu運算有多快;當然防止重複可以考慮休眠例如一毫秒,但這樣就會丟失效能,想想雪花演算法一毫秒能產生4095個不重複id,我們好歹也可以向它學習吧,以上說了這麼多少就明白了這個要求也是蠻苛刻的,當中我也想過用雪花演算法,但由於生成的id比較長(後面我會說為什麼不適宜)!
下面來看看我對這個唯一時間戳id生成的**演算法,借鑑了點雪花演算法:
///當中我加了一點補位演算法,保證每次出來的id長度一致,之前提到了是用在禮券號上的,那就應該不能這麼長,後續我又繼續進行了32進製計算,縮短到8-10位左右,但大家估計覺的還是長,那就看取決你把相差時間應該縮短。但如果直接用雪花演算法生成的id進行32位進製縮短也是在10位以上,所以我沒有用到。///時間戳id
/// public
class
timestampid
//////
獲取單個例項物件
/// ///
最初時間,與當前時間做個相差取時間戳
///public
static timestampid getinstance(datetime? initialdatetime = null
)
//////
最初時間,作用時間戳的相差
/// protected
datetime initialdatetime
}//////
獲取時間戳id
/// ///
public
string
getid()";}
private
string fill(long
temp)
return
newstring(chars.toarray()) +num;
}//////
獲取乙個時間戳字串
/// ///
public
long getuniquetimestamp(long lasttimestamp, out
long
temp)
}else
return
timestamp;}}
//////
/// ///
private
long
gettimestamp()
}
對了,忘記說了效能問題,一毫秒預計能生成1000個,呵呵,還算過得去
接下來談談禮券這塊業務,類似我們初創電商公司這種需要去網際網路上大量拉攏會員,所以也相對需要大量的推廣禮券號,如果成熟的電商如京東和天貓等,他們所有禮券都已經繫結到自己會員身上,在使用上根本不用去關注填寫什麼禮券號,也是他們的禮券體系相對完整和成熟,故我們對禮券號的的生成需求也是一塊心病。
下面再說說雪花演算法生成的id,比較適合使用一些流水資料,如果分布式上生成時就需要考慮一台吞吐量好的服務統一生成id,或者也可以進行多台伺服器+負載均衡,當然每台機器出的id還是需要標識補位(比如機器自定義的編號id)增加長度防止同一時間重複id。
2017.1.22 > 在生產環境中,突然又發生了禮券號重複問題,導致我懷疑演算法的不嚴謹,後來發現觸發生成的**是兩個服務程序,哈哈,真是自己找坑跳;故大家在部署時候一定要確保id生成在乙個程序裡,如果分布式還是老話,加上必要的分布標識no
一 時間複雜度
一 時間複雜度計算規則 1.基本操作,即只有常數項,其時間複雜度為o 1 比如if,print 與規模n無關 2.順序結構 按加法計算 3.迴圈結構,按乘法計算 4。分支結構,時間複雜度取最大值。二 常見時間複雜度與大小關係 常數項 o 1 12線性項 o n 2n 3平方項 o n 2 4n 3 ...
第一時間響應客戶
為響應各種特殊需求,卓越亞馬遜開始大刀闊斧地變革其物流管理系統。早上到公司上班,只要輕點滑鼠,選中一本 杜拉拉公升職記 下午,它就被送到了你的面前。國內b2c電子商務公司卓越亞馬遜的這項服務討到了很多上班族的歡心。最近,這家網際網路公司又開始了他們的新一 勢,以滿足消費者的各種特殊要求。可是目前,國...
演算法(一)時間複雜度
演算法很重要,但是一般情況下做移動開發並不經常用到,所以很多同學早就將演算法打了個大禮包送還給了老師了,況且很多同學並沒有學習過演算法。這個系列就讓對演算法頭疼的同學能快速的掌握基本的演算法。過年放假階段玩了會遊戲nba2k17的生涯模式,沒有比賽的日子也都是訓練,而且這些訓練都是自發的,沒有人逼你...