(本文作者温少,首发于博客园,转载请注明)
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 温少的日志 阅读(2706) 评论(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  回复  更多评论   

只有注册用户登录后才能发表评论。


网站导航: