zoukankan      html  css  js  c++  java
  • 全局唯一ID设计

    1.用数据库自増字段

    2.采用UUID

    3.用uuid生成器

    4.采用 Twitter Snowflake 的Id算法

    单机系统用1,2,3,4,

    分布式系统用2,3,4

    分布式有序id用4

    附上4的源码:

    public class IdWorker {
    
        private final long twepoch = 1288834974657L;
        private final long workerIdBits = 5L;
        private final long datacenterIdBits = 5L;
        private final long maxWorkerId = -1L ^ (-1L << workerIdBits);
        private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);
        private final long sequenceBits = 12L;
        private final long workerIdShift = sequenceBits;
        private final long datacenterIdShift = sequenceBits + workerIdBits;
        private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;
        private final long sequenceMask = -1L ^ (-1L << sequenceBits);
    
        private long workerId;
        private long datacenterId;
        private long sequence = 0L;
        private long lastTimestamp = -1L;
    
        public IdWorker(long workerId, long datacenterId) {
            if (workerId > maxWorkerId || workerId < 0) {
                throw new IllegalArgumentException(
                        String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));
            }
            if (datacenterId > maxDatacenterId || datacenterId < 0) {
                throw new IllegalArgumentException(
                        String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));
            }
            this.workerId = workerId;
            this.datacenterId = datacenterId;
        }
    
        public synchronized long nextId() {
            long timestamp = timeGen();
            if (timestamp < lastTimestamp) {
                throw new RuntimeException(String.format(
                        "Clock moved backwards.  Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));
            }
            if (lastTimestamp == timestamp) {
                sequence = (sequence + 1) & sequenceMask;
                if (sequence == 0) {
                    timestamp = tilNextMillis(lastTimestamp);
                }
            } else {
                sequence = 0L;
            }
    
            lastTimestamp = timestamp;
    
            return ((timestamp - twepoch) << timestampLeftShift) | (datacenterId << datacenterIdShift)
                    | (workerId << workerIdShift) | sequence;
        }
    
        protected long tilNextMillis(long lastTimestamp) {
            long timestamp = timeGen();
            while (timestamp <= lastTimestamp) {
                timestamp = timeGen();
            }
            return timestamp;
        }
    
        protected long timeGen() {
            return System.currentTimeMillis();
        }
    
        public static void main(String[] args) {
            IdWorker idWorker = new IdWorker(0, 17);
            for (int i = 0; i < 10; i++) {
                long id = idWorker.nextId();
                System.out.println(id);
            }
        }
    
    }
  • 相关阅读:
    参考 ZTree 加载大数据量。加载慢问题解析
    script标签中type为<script type="text/x-template">是个啥
    最全的常用正则表达式大全
    利用split
    Lucene4.4.0 开发之排序
    scrollWidth,clientWidth,offsetWidth的区别
    JavaScript SetInterval与setTimeout使用方法详解
    JS实现悬浮移动窗口(悬浮广告)的特效
    $.ajax()方法详解
    DB2导入导出编目配置
  • 原文地址:https://www.cnblogs.com/huzi007/p/6222218.html
Copyright © 2011-2022 走看看