java生成流水號(hào)唯一 javaWeb 在系統(tǒng)高并發(fā)的情況下生成有序流水號(hào)?
javaWeb 在系統(tǒng)高并發(fā)的情況下生成有序流水號(hào)?1. 如果題主不要求ID是數(shù)字,建議使用最簡(jiǎn)單的,也就是UUID,包含了機(jī)器碼,時(shí)間戳,隨機(jī)數(shù)等,不過(guò)UUID最后生成的是全局唯一的字符串,不是整數(shù)
javaWeb 在系統(tǒng)高并發(fā)的情況下生成有序流水號(hào)?
1. 如果題主不要求ID是數(shù)字,建議使用最簡(jiǎn)單的,也就是UUID,包含了機(jī)器碼,時(shí)間戳,隨機(jī)數(shù)等,不過(guò)UUID最后生成的是全局唯一的字符串,不是整數(shù),并且看起來(lái)是無(wú)序的。
2. MySQL自增ID的,使用一張表存放各種業(yè)務(wù)id,然后每個(gè)分布式系統(tǒng)插入一條id之后,生成一千萬(wàn)條局部的數(shù)字與這個(gè)id拼接,那么每個(gè)系統(tǒng)取到一個(gè)id,就相當(dāng)于生成了一千萬(wàn)條id,足夠使用很長(zhǎng)一段時(shí)間。這一千萬(wàn)條id可以事先定義好,在系統(tǒng)啟動(dòng)時(shí)就放入內(nèi)存中,由于只是id,并不會(huì)占用多大的內(nèi)存,MySQL可以搭建成集群,并不影響自增id的使用。
3. 與MySQL自增ID類似,使用Redis的incr實(shí)現(xiàn)自增。每個(gè)分布式系統(tǒng)像Redis使用incr插入一條id之后,生成一千萬(wàn)條局部的數(shù)字與這個(gè)id拼接,那么每個(gè)系統(tǒng)取到一個(gè)id,就相當(dāng)于生成了一千萬(wàn)條id,足夠使用很長(zhǎng)一段時(shí)間。這一千萬(wàn)條id可以事先定義好,在系統(tǒng)啟動(dòng)時(shí)就放入內(nèi)存中。由于只是id,并不會(huì)占用多大的內(nèi)存,Redis也可以搭建成集群,并不影響自增id的使用。
4. twitter的snowflake算法,與UUID類似,包含了機(jī)器碼,時(shí)間戳,隨機(jī)數(shù)等,不過(guò)最后生成的是64位的整數(shù),可以滿足很多分布式系統(tǒng)的要求。如果要求id是整數(shù)的話,建議不要使用UUID而用snowflake。
Java中如何動(dòng)態(tài)生成一個(gè)類和這個(gè)類的對(duì)象并且存入數(shù)據(jù)庫(kù)?
1. 樓上的思路是正確的,不過(guò)大多數(shù)情況不推薦動(dòng)態(tài)生成類再去動(dòng)態(tài)編譯,這方面不是java擅長(zhǎng)的;
2. 如果有動(dòng)態(tài)腳本類需求,可以使用腳本語(yǔ)言(如grooy),或者規(guī)則引擎(drools),存儲(chǔ)與解釋運(yùn)行;
3. 還可以通過(guò)設(shè)計(jì)模式解決,解決方案有很多,能否詳細(xì)說(shuō)明一下場(chǎng)景,方便做針對(duì)性的解答。