分布式id生成器,互联网

来源:互联网 发布:域名 购买 编辑:程序博客网 时间:2024/06/05 22:51
简单的分布式id生成器,10位时间戳(秒)+自增id+2位机器id,应该能满足一般的应用了;原创,转载请注明出处
/** * * @Title: DistributedIdGenerator.java * @Description: 分布式id生成器 (10位时间戳(秒)+自增id+2位机器id)集群中能保证唯一(必须配置serverNums机器数)* @date 2016年8月10日 * @version V1.0 */public class DistributedIdGenerator {static String SERVER_ID_PREFIX=getServerId();<span style="white-space:pre"></span><span style="white-space:pre"></span>static final String EMPTY="";<span style="white-space:pre"></span><span style="white-space:pre"></span>final Map<Integer,Integer> secondSequenceMap=new ConcurrentHashMap<Integer, Integer>();<span style="white-space:pre"></span><span style="white-space:pre"></span>public DistributedIdGenerator(int serverNums){<span style="white-space:pre"></span><span style="white-space:pre"></span>}<span style="white-space:pre"></span><span style="white-space:pre"></span>public DistributedIdGenerator(){<span style="white-space:pre"></span><span style="white-space:pre"></span>}<span style="white-space:pre"></span><span style="white-space:pre"></span><span style="white-space:pre"></span>public synchronized long generateId(){<span style="white-space:pre"></span>long time = System.currentTimeMillis();<span style="white-space:pre"></span>int second=(int) (time/1000L);<span style="white-space:pre"></span>int sequence=0;<span style="white-space:pre"></span>if(secondSequenceMap.containsKey(second)){<span style="white-space:pre"></span> sequence=secondSequenceMap.get(second);<span style="white-space:pre"></span>}else{<span style="white-space:pre"></span>secondSequenceMap.clear();<span style="white-space:pre"></span>}<span style="white-space:pre"></span>sequence++;<span style="white-space:pre"></span>secondSequenceMap.put(second, sequence);<span style="white-space:pre"></span>return Long.valueOf(second+EMPTY+sequence+SERVER_ID_PREFIX);<span style="white-space:pre"></span>}<span style="white-space:pre"></span><span style="white-space:pre"></span>/**<span style="white-space:pre"></span> * 此处有待斟酌 pid还是有概率会重复的(尽管加上了随机数)<span style="white-space:pre"></span> * @return<span style="white-space:pre"></span> */<span style="white-space:pre"></span>private static String getServerId(){<span style="white-space:pre"></span>String name = ManagementFactory.getRuntimeMXBean().getName();  <span style="white-space:pre"></span>String pid = name.split("@")[0]; <span style="white-space:pre"></span>int random=new Random().nextInt(10);<span style="white-space:pre"></span>if(pid.length()<=1){<span style="white-space:pre"></span>pid=pid+""+random;<span style="white-space:pre"></span>}<span style="white-space:pre"></span>if(pid.length()>2){<span style="white-space:pre"></span>pid=pid.substring(0, 2);<span style="white-space:pre"></span>}<span style="white-space:pre"></span>if(random==0){<span style="white-space:pre"></span>random=1;<span style="white-space:pre"></span>}<span style="white-space:pre"></span>return random+pid;<span style="white-space:pre"></span>}<span style="white-space:pre"></span><span style="white-space:pre"></span>public static void main(String[] args) throws Exception {<span style="white-space:pre"></span>final Map<Long,Long> sets = new ConcurrentHashMap<Long,Long>();<span style="white-space:pre"></span>final AtomicInteger counts = new AtomicInteger(0);<span style="white-space:pre"></span>final DistributedIdGenerator idGen = new DistributedIdGenerator(1);<span style="white-space:pre"></span>List<Callable<Long>> partitions = new ArrayList<Callable<Long>>();<span style="white-space:pre"></span>for (int i = 0; i < 100; i++) {<span style="white-space:pre"></span>partitions.add(new Callable<Long>() {<span style="white-space:pre"></span><span style="white-space:pre"></span>@Override<span style="white-space:pre"></span>public Long call() throws Exception {<span style="white-space:pre"></span>for(int j=0;j<10000;j++){<span style="white-space:pre"></span>long id = idGen.generateId();<span style="white-space:pre"></span>System.out.println(id);<span style="white-space:pre"></span>if (sets.containsKey(id) ){<span style="white-space:pre"></span>counts.incrementAndGet();<span style="white-space:pre"></span>}<span style="white-space:pre"></span>sets.put(id, id);<span style="white-space:pre"></span>}<span style="white-space:pre"></span>return 0l;<span style="white-space:pre"></span>}<span style="white-space:pre"></span><span style="white-space:pre"></span>});<span style="white-space:pre"></span>}<span style="white-space:pre"></span>ExecutorService executorPool = Executors.newFixedThreadPool(Runtime<span style="white-space:pre"></span>.getRuntime().availableProcessors()*4);<span style="white-space:pre"></span>try {<span style="white-space:pre"></span>long s = System.currentTimeMillis();<span style="white-space:pre"></span>executorPool.invokeAll(partitions);<span style="white-space:pre"></span>long s_avg = System.currentTimeMillis() - s;<span style="white-space:pre"></span>System.out.println("完成时间需要: " + s_avg / 1.0e3 + "秒");<span style="white-space:pre"></span>executorPool.shutdown();<span style="white-space:pre"></span>} catch (Exception e) {<span style="white-space:pre"></span>e.printStackTrace();<span style="white-space:pre"></span>}<span style="white-space:pre"></span>System.out.println("重复数:"+counts.get());<span style="white-space:pre"></span>long time = System.currentTimeMillis();<span style="white-space:pre"></span>int second=(int) (time/1000L);<span style="white-space:pre"></span>System.out.println(second);<span style="white-space:pre"></span>}<span style="white-space:pre"></span>}
0 0