(本文作者溫少,首發于博客園,轉載請注明)
          ID生成算法,其中一種就是使用GUID(又稱UUID),使用128位存儲。UUID的一個問題是太長,可讀性太差,人腦無法記憶。

          替代方案之一,就是使用關系數據庫的自增長字段,自增長字段的一個問題是,無法預先創建一個ID,只能夠在保存的時候才能生成ID,這對于批量關聯插入數據來說,不滿足需求。

          替 代方案之二,就是使用一個記錄ID的表,每次加一,在事務中使用Select FOR UPDATE來讀取然后UPDATE SET FVALUE = FVALUE + 1,或者使用我之前文章中所提到的CAS算法。 這樣做,會導致性能低下,每生成一個ID的成本都很高。

          替代方案之 三,就是把ID分成兩部分,Seed和IncrementID。Seed采用上面的方案二或者其他辦法生成,IncrementID使用一個 AtomicInteger來每次遞增生成。SEED轉化為九進制數字,這樣SEED就不會包含9,于是使用9作為分隔符,把SEED和 IncrementID隔開。這樣做,就可以做高性能產生ID,而且確保不重復。甚至可以更進一步,SEED由一個中心服務器生成。使用9個分隔符號隔開 SEED和IncrementID,好處是SEED是變長,而不是使用固定位數來保存SEED,這樣產生的ID會更短,可讀性更好。

          舉例,34915,其中34時SEED,15是IncrementID,9是分隔符,SEED部分采用九進制表示法,確保不出現9,第一個9之后的內容屬于IncrementID。

          我已經做了一個實現,用于實際開發中,思路采用方案三,有很多實作的細節,但是總體設計思路就是如此。
          (本文作者溫少,首發于博客園,轉載請注明)
          posted on 2007-11-16 07:09 溫少的日志 閱讀(2738) 評論(8)  編輯  收藏
          Comments
          • # re: 小議ID生成算法
            Robin's Java World
            Posted @ 2007-11-16 08:47
            怎么控制SEED的不重復?如果用你的方案二本身不就有你所說的性能問題?IncrementID又怎么得?怎么保證不重復?
            總體感覺沒太想清楚,個人意見!  回復  更多評論   
          • # re: 小議ID生成算法[未登錄]
            太陽里的雪
            Posted @ 2007-11-16 09:24
            暈,這方案3不就比方案2還要耗性能了嘛!  回復  更多評論   
          • # re: 小議ID生成算法
            溫少的日志
            Posted @ 2007-11-16 10:27
            @Robin's Java World
            @太陽里的雪
            你們都沒認真想想,SEED只需要獲取一次,然后就一直使用。而SEED的獲取只需要在程序啟動時!  回復  更多評論   
          • # re: 小議ID生成算法
            sitinspring
            Posted @ 2007-11-16 19:14
            不錯的文章.

              回復  更多評論   
          • # re: 小議ID生成算法
            simon.xu
            Posted @ 2007-11-27 19:22
            去看看數據庫sequence的生成方法吧,那是成熟算法

            可以依舊用數據庫,不過,使用一個增量來緩存,每次增加超過增量,才寫數據庫,否則,直接在應用內部+1

            建議修改一下你的算法  回復  更多評論   
          • # re: 小議ID生成算法
            溫少的日志
            Posted @ 2007-11-28 10:17
            @simon.xu
            你說的方法在過去的系統中用過,每次遞增一批,這算是方案2的改進。使用方案3,在種子上作一些處理之后,能夠更好實現全局唯一,可以確保不同服務器不同的數據庫分配出來的ID唯一。

            從我博客主站上看:
            http://www.cnblogs.com/jobs/archive/2007/11/16/961116.html

            評論更多,描述了更詳盡的情況。  回復  更多評論   
          • # re: 小議ID生成算法
            simon.xu
            Posted @ 2007-12-03 13:05
            那方案3其實就是在多機的時候,id分成兩個部分而已,一個實際是機器id,另一個是實際的本機id。
            感覺為了追求id長度短,有點過份設計了,實際應用應當對這個長度要求很低,使用固定長度完全可以,畢竟你的環境也不會有100個以上的獨立系統。  回復  更多評論   
          • # SOHO-CN公司誠聘網絡兼職,每天工資至少100元且日付
            wumao
            Posted @ 2009-03-15 16:11
            工作描述:按照公司的要求,每天兼職約3小時,完全在電腦里工作,家里網吧均可。
            工作待遇: 每日底薪為100元/天,工作日付,工資每天中午12點準時結算
            工作地點:不限。全國各地,在家、宿舍、網吧等,
            工作要求:
            1、男女不限、學歷不限,在職或學生皆可,要求勤奮細心,有責任感,工作認真負責;
            2、會打字、會在網上發帖,按公司要求具備團隊合作精神;
            3、平均每天能工作2-3小時,時間自定,完成當天工作量即可。
            詳情請查看我們公司招聘網站:http://www.17lkdy.cn
            (請放心,本公司所有招聘職位不需要交納任何費用)
            公司每天工資發放記錄:http://www.17lkdy.cn/jilu.html  回復  更多評論   

          只有注冊用戶登錄后才能發表評論。


          網站導航:
          博客園   IT新聞   Chat2DB   C++博客   博問  
           
           
          主站蜘蛛池模板: 永德县| 洮南市| 新源县| 拉萨市| 花莲市| 张家港市| 辽阳县| 永胜县| 叶城县| 鸡西市| 仙居县| 双鸭山市| 揭阳市| 桐柏县| 泰安市| 福安市| 杭州市| 怀柔区| 方山县| 维西| 永仁县| 治县。| 奈曼旗| 左贡县| 金门县| 玉门市| 绵阳市| 阿巴嘎旗| 瓮安县| 宁海县| 信宜市| 静乐县| 青岛市| 阳朔县| 朝阳区| 岢岚县| 乳山市| 威海市| 尉氏县| 邵东县| 丰顺县|