首页 > 试题广场 >

一般在大型系统中,都会为每个资源分配一个唯一的ID,在大型系

[问答题]
一般在大型系统中,都会为每个资源分配一个唯一的ID,在大型系统中这个并非易事,目前人人网一天产生新鲜事在千万量级,现在由你来设计一个产生新鲜事ID的模块。要求写出解题思路和伪代码。
拿分法宝:
1) 新鲜事ID绝对不能重复
2)你可以借助DB等辅助工具,提供InsertDB, UpdateDB, QueryDB三API供你使用, 假设访问DB不会有异常。
3)  高并发情况要考虑, 提供Lock, Unlock两个API供你使用。
4) 要求写出解题思路和伪代码出来。
解题思路:
1、使用单例模式。定义一个sequenceGenerator单例类, 声明一个getSequence方法,将sequence序号依次相加

2、产生 ID 的规则是:将 ID设置为字符串。ID =  当前日期+整型sequence。

伪代码:

public class SequenceGenerator {

private SequenceGenerator generatorInstance = null;

private long sequence = 0;

private SequenceGenerator (){}

public static SequenceGenerator getInstance(){

   if(generatorInstance == null){
      synchoronized(this){
       generatorInstance  = new SequenceGenerator ();
   }
   return generatorInstance  ;
 }
}

public synchronized int getSequence(){
      if(++sequence没有超过long型的最大值)return sequence;
    
}
}


发表于 2015-01-31 14:13:41 回复(0)
uuid
发表于 2015-04-02 06:53:23 回复(0)
分桶,可根据时间对10取余,分成10个桶并编号0...9,每个桶的ID以桶号开头,这样竞争分布到桶内。设置一个表,表中以桶号为主键,对应一个数值,每次获取对应桶号的数值并加上桶号前缀组成ID,获取时可对对应桶号的记录进行加锁。
发表于 2015-03-02 23:12:38 回复(0)