以秒为单位生成唯一的时间序列号

标签: 单位 唯一 时间序列 | 发表时间:2018-09-01 23:10 | 作者:
出处:http://www.iteye.com
/**
 * 功能: 以秒为单位生成唯一的序列号 <br/>
 * 生成格式:YYMMddHHmmssXXXXXXX <br/>
 * XXXXXXX:代表序列号,从1开始
 * 例子: 1808312321280000001 或者 1808312321280001234 <br/>
 * <p>局限性: 每秒生成最大范围 (1000万-1) 个数</p>
 * Created by Administrator on 2018/8/31.
 */
public final class GenerateDateTimeUniqueID {

    private static final DateFormat DF = new SimpleDateFormat("yyMMddHHmmss");
    private static volatile long LAST_TIME = -1;
    private static final AtomicInteger COUNT = new AtomicInteger();
    private static final Object LOCK = new Object();

    //测试是否有生成重复的ID
    public static final ConcurrentMap<String, Boolean> MAP = new ConcurrentHashMap<String, Boolean>();

    //1 000 000
    private static final byte LEVEL = 7; //限定一秒钟最多产生1000万-1 个数
    private static final String ZERO_0 = "";
    private static final String ZERO_1 = "0";
    private static final String ZERO_2 = "00";
    private static final String ZERO_3 = "000";
    private static final String ZERO_4 = "0000";
    private static final String ZERO_5 = "00000";
    private static final String ZERO_6 = "000000";


    /*******
     *
     * 测试机器系统参数: Win7 64位 i5-4210M 4core 2.6GHz 内存8GB
     *
     * ********/


    /**
     * 测试10个线程并发产生,每秒可以产生310万左右个序列号
     * *
     */
    public static String generateDateTimeUniqueIdStr() throws Exception {
        Date date = new Date();
        String dateStr = DF.format(date);
        long curTime = Long.parseLong(dateStr);
        int curCount = 0;

        synchronized (GenerateDateTimeUniqueID.class) {
            if (curTime < LAST_TIME) {
                curTime = LAST_TIME;
            } else if (curTime > LAST_TIME) {
                LAST_TIME = curTime;
                System.out.println(Thread.currentThread().getName() + "-" + COUNT.get());
                COUNT.set(0);
            }
            curCount = COUNT.incrementAndGet();
        }

        return curTime + format(curCount);
    }

    /**
     * 测试10个线程并发产生,每秒可以产生290万左右个序列号
     * *
     */
    public static long generateDateTimeUniqueId() {
        Date date = new Date();
        String dateStr = DF.format(date);
        long curTime = Long.parseLong(dateStr);
        int curCount = 0;

        synchronized (GenerateDateTimeUniqueID.class) {
            if (curTime < LAST_TIME) {
                curTime = LAST_TIME;
            } else if (curTime > LAST_TIME) {
                LAST_TIME = curTime;
                System.out.println(Thread.currentThread().getName() + "-" + COUNT.get());
                COUNT.set(0);
            }
            curCount = COUNT.incrementAndGet();
        }

        return Long.parseLong(curTime + format(curCount));
    }


    private static String format(int value) {
        int temp = value;
        int count = 0;
        while (temp > 0) {
            temp = temp / 10;
            count++;
        }
        switch (LEVEL - count) {
            case 0:
                return ZERO_0 + value;
            case 1:
                return ZERO_1 + value;
            case 2:
                return ZERO_2 + value;
            case 3:
                return ZERO_3 + value;
            case 4:
                return ZERO_4 + value;
            case 5:
                return ZERO_5 + value;
            case 6:
                return ZERO_6 + value;
            default:
                return "9999999";
//                throw new IllegalStateException(); //再处理
        }
    }

    private GenerateDateTimeUniqueID() {
    }

    public static void main(String[] args) {

        long cur = System.currentTimeMillis();
        for (int i = 1; i < 1000000000; i++) {
            System.out.println(generateDateTimeUniqueId());

        }

//        int num = 6;
//        ExecutorService executorService = Executors.newFixedThreadPool(num);
//        for (int i = 0; i < num; i++) {
//            executorService.submit(new TestThread());
//        }
        System.out.println("spend " + (System.currentTimeMillis() - cur) + " ms");
    }

    static class TestThread implements Runnable {

        @Override
        public void run() {
            while (true) {
                String id = generateDateTimeUniqueIdStr();
                Boolean isHas = MAP.putIfAbsent(id, Boolean.TRUE);
                if (isHas != null) {
                    throw new IllegalArgumentException();
                }
            }
        }
    }
}

 



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [单位 唯一 时间序列] 推荐:

以秒为单位生成唯一的时间序列号

- - ITeye博客
//测试是否有生成重复的ID. private static final byte LEVEL = 7; //限定一秒钟最多产生1000万-1 个数. * 测试机器系统参数: Win7 64位 i5-4210M 4core 2.6GHz 内存8GB. * 测试10个线程并发产生,每秒可以产生310万左右个序列号.

时间序列趋势判断

- - 标点符
判断时间序列数据是上升还是下降是我们常见的问题. 比如某个股票在过去一年整体趋势是上升还是下降. 我们可以通过画图的方式直接观测出上升还是下降. 但每次观测图片非常的麻烦,有没有一些数学方法进行检验. 则:$S= \sum_{m=1}^{n}(|A_m-A_{m-1}|)$. 当序列单调时:$S = |A_n-A_0|$,否则$ S > |A_n-A_0|$.

妄谈时间序列表格型大数据系统设计

- - Solrex Shuffling
一直在特定领域的分布式系统一线摸爬滚打,曾取得一些微不足道的成绩,也犯过一些相当低级的错误. 回头一看,每一个成绩和错误都是醉人的一课,让我在兴奋和懊恼的沉迷中成长. 自己是个幸运儿,作为一个 freshman 就能够有机会承担许多 old guy 才能够有的职责. 战战兢兢、如履薄冰的同时,在一线的实作和思考也让我获得了一些珍贵的经验,却直至今日才够胆量写出来一晒.

时间序列分段算法 [Time series Breakout Detection]

- - ITeye博客
在时间序列分析中,断点检测(breakout detection)是一个很基本的问题. 通过捕捉时序数据中的断点(breakout),来发现时序数据所表示的系统在过去是否发生了某种事件(event),进而为系统诊断提供必要的数据支持. 为了实现对时序断点的检测,我们首先需要对时序的整体时序做拟合. 这里我们通过一条直线来拟合一段时序,如果时序的趋势发生了变化,则用多条直线来拟合整条时序数据.

异常检测之时间序列的异常检测

- -
其实之前介绍过3倍方差,只是,这里的3倍方差讲的是在时间序列异常检测中的应用. 一个很直接的异常判定思路是,拿最新3个数据点的平均值(tail_avg方法)和整个序列比较,看是否偏离历史总体平均水平太多,如果偏离太多,就报警. 和上述算法基本一致,只是比较对象不是整个序列,而是开始一个小时(其实这种这种思想可以推广,只要是时间序列刚开始的一段时间即可)的以内的数据,求出这段时间的均值和标准差和尾部数据(新产生的数据)用三本方差的方法比较即可.

用Python进行时间序列预测的7种方法

- - 标点符
时间序列预测在日常分析中常会用到,前段时间在处理预算相关的内容,涉到一些指标预测,学习到了这篇文章,整理出来分享给大家. 数据集(JetRail高铁的乘客数量)下载,链接: https://pan.baidu.com/s/15w5_5_o8IK6ZT3VlNSRa7Q 提取码: 9be3. 假设要解决一个时序问题:根据过往两年的数据(2012 年 8 月至 2014 年 8月),需要用这些数据预测接下来 7 个月的乘客数量.

时间序列异常检测算法梳理

- - 标点符
时间序列的异常检测问题通常表示为相对于某些标准信号或常见信号的离群点. 虽然有很多的异常类型,但是我们只关注业务角度中最重要的类型,比如意外的峰值、下降、趋势变化以及等级转换(level shifts). 革新性异常:innovational outlier (IO),造成离群点的干扰不仅作用于$X_T$,而且影响T时刻以后序列的所有观察值.

通俗易懂带你看懂时间序列分解模型?高深也不过如此

- - IT瘾-bigdata
观察趋势,或许是我们在日常分析中最常见的需求. 但遗憾的是,许多管理者或者业务分析人员,对着高高低低的折线图(时间序列数据)不知道怎么“看”. 本节将介绍一种通俗易懂的时间序列分解方法,帮助大家从时间序列的波动中挖掘信息. 另外,时间序列数据经过分解之后,可以对未来的数值进行一定程度的预测. 5.5.1  怎样观察时间序列数据.

公租房,单位房?

- crazy wave - 南方周末-热点新闻
“你们这个单位会分房吗,什么时候分. ”在上个世纪90年代末福利房取消之前,这样的问题在找工作时必然会出现. 十多年后,广州的“漂一族”将需要再次提出这个问题.

编程巨星的唯一秘诀

- Ken - python.cn(jobs, news)
# 本文是从 The Singular Secret of the Rockstar Programmer 这篇文章翻译而来. 别以为是那些软件开发定律,别以为是开发出那些特殊用途的软件,别以为是软件设计技术本身. 只有一条真理决定了一个软件程序员的成功还是失败. 由于坚持这个真理,一个资深的程序员能在一天的时间里学会一门新的编程语言,而由于不坚持这条真理,一个初级的程序员用十年时间也只能挣到一份糊口的钱、永远是来实现别人的设计、永远不够优秀而得不到晋升的机会.