昨天突然考虑到这个问题,在并发比较大的情况下,你用于生成唯一ID的函数是否还能正常运行?也就是说比如我一下子进来40000个订单,你需要生成不重复的订单ID吧?

对于这个问题我以前没考虑过,但是可能是误打误撞,我以前一开始设计的ID生成思路是13位时间戳+随机7位,就是为了凑够20位的ID。因为如果是在同一时间那么可以忽略掉13位时间戳,剩下的7位是需要关注的,我有预选的34个字母+数字,根据排列组合可以得知,可以有34^7个排列组合方法(也就是52523350144)。

那么理论上同一时刻(如果时间戳相同的话)我可以生成52523350144个ID(我已经数过了,是525亿),但是我没有在分布式场景下测试过,不敢保证不出问题。而我也有个猜测,比如我有三台应用服务器做负载均衡,同一时刻这三台生成的相同ID的几率为1/525亿*525亿*525亿,几率也太小了吧,如果还不放心,那么你就生成ID后去检查自己的是否唯一,如果已存在,你就再生成一个咯。

以下是测试:ID类

package com.internetsaying.utils;

import java.util.Date;
import java.util.Random;

public class IDUtils {

    /**
     * 生成20位ID,理论上在同一时刻能生成的ID数为34^7=52523350144[5.2523350144E10]
     * @param time
     * @return
     */
    public static String createID20(Date time){
        String[] vocabulary = {
                "A","B","C","D","E","F","G","H","I","J","K","L","M","N",
                "P","Q","R","S","T","U","V","W","X","Y","Z","1","2","3",
                "4","5","6","7","8","9"
        };
        int n = vocabulary.length;
        Random rand = new Random();
        StringBuilder s = new StringBuilder();
        for(int i = 0; i < 7; i++){
            s.append(vocabulary[rand.nextInt(n)]);
        }
        String str = time.getTime() + s.toString();
        return str;
    }
}

模拟并发类

package com.isay.test;

import java.util.Date;
import java.util.Set;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import org.junit.Test;

import com.internetsaying.utils.IDUtils;

public class OtherTest {

    @Test
    public void uniqueID() {
        System.out.println(Math.pow(34, 7));
    }

    public static void main(String[] args) {
        int concurrentNum = 70000;    //并发数
        CyclicBarrier c = new CyclicBarrier(concurrentNum);        // 让线程同时开始
        CountDownLatch l = new CountDownLatch(concurrentNum);    // 所有线程结束在执行统计
        ExecutorService es = Executors.newCachedThreadPool();

        Set<String> set = ConcurrentHashMap.newKeySet();        // Set集合,存储生成的ID
        for (int i = 0; i < concurrentNum; i++) {
            es.submit(new Demo(set,c,l));
        }
        es.shutdown();

        try {
            l.await();    // 前面的任务执行完才到下一步
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(set.size());
    }
}

class Demo implements Runnable{

    private Set<String> set;
    private CyclicBarrier c;
    private CountDownLatch l;

    public Demo(Set<String> set, CyclicBarrier c, CountDownLatch l) {
        super();
        this.set = set;
        this.c = c;
        this.l = l;
    }

    @Override
    public void run() {
        try {
            c.await();    // 等待,直到有足够的线程
        } catch (InterruptedException | BrokenBarrierException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        String id20 = IDUtils.createID20(new Date());
        set.add(id20);
        l.countDown();    // 每当有线程结束就减1
    }

}

结果:输出70000.(如果有n个并发,最终set集合里面的size也是n,就证明生成了n个不重复的id,那么就成功)

说明:如果你的电脑大于8G,可以直接测试70000的并发,如果小于8G,你就要小心了,因为是n个线程(用户)一起开始,电脑吃不消。

我希望大家帮我找出这个策略的问题,多多测试

测试唯一ID支持多大的并发量的更多相关文章

  1. JMeter一台机器可以支持多大的并发量

    Support for concurrent thread is basically depends on many factors like OS, free RAM and connections ...

  2. MySQL到底能支持多大的数据量?

    MySQL是中小型网站普遍使用的数据库之一,然而,很多人并不清楚MySQL到底能支持多大的数据量,再加上某些国内CMS厂商把数据承载量的责任推给它,导致很多不了解MySQL的站长对它产生了很多误解,那 ...

  3. 转:MySQL到底能支持多大的数据量?

    MySQL到底能支持多大的数据量? MySQL是中小型网站普遍使用的数据库之一,然而,很多人并不清楚MySQL到底能支持多大的数据量,再加上某些国内CMS厂商把数据承载量的责任推给它,导致很多不了解M ...

  4. Redis为什么可以支持那么大的并发访问量?为什么redis没有单点并发瓶颈?

    一是redis使用内存 而是redis使用多路复用的IO模型: 现代的UNIX操作系统提供了select/poll/kqueue/epoll这样的系统调用,这些系统调用的功能是:你告知我一批套接字,当 ...

  5. 如何在高并发分布式系统中生成全局唯一Id

    月整理出来,有兴趣的园友可以关注下我的博客. 分享原由,最近公司用到,并且在找最合适的方案,希望大家多参与讨论和提出新方案.我和我的小伙伴们也讨论了这个主题,我受益匪浅啊…… 博文示例: 1.     ...

  6. 高并发分布式系统中生成全局唯一Id汇总

    数据在分片时,典型的是分库分表,就有一个全局ID生成的问题.单纯的生成全局ID并不是什么难题,但是生成的ID通常要满足分片的一些要求:   1 不能有单点故障.   2 以时间为序,或者ID里包含时间 ...

  7. 如何在高并发分布式系统中生成全局唯一Id(转)

    http://www.cnblogs.com/heyuquan/p/global-guid-identity-maxId.html 又一个多月没冒泡了,其实最近学了些东西,但是没有安排时间整理成博文, ...

  8. (转)如何在高并发分布式系统中生成全局唯一Id

    又一个多月没冒泡了,其实最近学了些东西,但是没有安排时间整理成博文,后续再奉上.最近还写了一个发邮件的组件以及性能测试请看 <NET开发邮件发送功能的全面教程(含邮件组件源码)> ,还弄了 ...

  9. 高并发分布式环境中获取全局唯一ID[分布式数据库全局唯一主键生成]

    需求说明 在过去单机系统中,生成唯一ID比较简单,可以使用MySQL的自增主键或者Oracle中的sequence, 在现在的大型高并发分布式系统中,以上策略就会有问题了,因为不同的数据库会部署到不同 ...

随机推荐

  1. How to create DMG on macOS

    hdiutil create -srcfolder /users/test1/ -volname test1 /users/test/test1.dmg

  2. javascript中关于value的一个小知识点(value既是属性也是变量)

    今天在学习input的value值时,发现这么一个小知识点,以前理解不太透彻 [1]以下这种情况是常见情况,会弹出“测试内容” <input type="button" va ...

  3. VS Code 编辑器

    使用VS Code 编辑器有一段时间了,感觉非常好用,已经成为了我的第一选择了.现在需要学习了一下了. 1,更改编辑器的默认设置 文件 =>首选项 => 设置 或 ctrl + ,(逗号) ...

  4. C#常忘语法笔记(C#程序设计基础1-4章)

    1.1 const:声明一个常量 1.2强转: double->int eg1: int i=(int)3.0; eg2: double d=3.0; int i=(int)d+1; strin ...

  5. js查漏补缺【未完】

    1.初始 1.小补. 1.在文本字符串中使用反斜杠对代码行进行换行. document.write("Hello \ World!"); 2.document.write docu ...

  6. P2084 进制转换

    原题链接 https://www.luogu.org/problemnew/show/P2084 这个题的思路就是先将输入的数字存到字符数组里,然后求出这一串数字中的非0元素的个数total,并记录最 ...

  7. window文件过长无法删除的处理方式

    解决方案: 如:aaa是要删除的文件夹,进入到要删除的文件夹下,新建一个test  1.以管理员身份打开CMD:  2 新建test空白目录:  3 执行命令,删除aaa文件夹:robocopy te ...

  8. CetenOS 6.9 搭建hubot运维机器人

    前言 Hubot是由Github开发的开源聊天机器人,基于Node.js采用CoffeeScript编写 可以借助Hubot开发Chatbot来自动化的完成想要一切自动化任务,比如: -运维自动化(编 ...

  9. web前端监控的三个方面探讨

    一. js错误监控方式 1. 主动判断 我们在一些运算之后,得到一个期望的结果,然而结果不是我们想要的 // test.js function calc(){ // code... return va ...

  10. Android GPS定位测试(附效果图)

    今天因为工作需要,把以前编写的一个GPS测试程序拿出来重新修改了一下.这个程序说起来有些历史了,是我11年编写的,那时候学了Android开发没多久,算是一个实验性的作品.现在工作需要,重新拿出来修整 ...