测试唯一ID支持多大的并发量
昨天突然考虑到这个问题,在并发比较大的情况下,你用于生成唯一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支持多大的并发量的更多相关文章
- JMeter一台机器可以支持多大的并发量
Support for concurrent thread is basically depends on many factors like OS, free RAM and connections ...
- MySQL到底能支持多大的数据量?
MySQL是中小型网站普遍使用的数据库之一,然而,很多人并不清楚MySQL到底能支持多大的数据量,再加上某些国内CMS厂商把数据承载量的责任推给它,导致很多不了解MySQL的站长对它产生了很多误解,那 ...
- 转:MySQL到底能支持多大的数据量?
MySQL到底能支持多大的数据量? MySQL是中小型网站普遍使用的数据库之一,然而,很多人并不清楚MySQL到底能支持多大的数据量,再加上某些国内CMS厂商把数据承载量的责任推给它,导致很多不了解M ...
- Redis为什么可以支持那么大的并发访问量?为什么redis没有单点并发瓶颈?
一是redis使用内存 而是redis使用多路复用的IO模型: 现代的UNIX操作系统提供了select/poll/kqueue/epoll这样的系统调用,这些系统调用的功能是:你告知我一批套接字,当 ...
- 如何在高并发分布式系统中生成全局唯一Id
月整理出来,有兴趣的园友可以关注下我的博客. 分享原由,最近公司用到,并且在找最合适的方案,希望大家多参与讨论和提出新方案.我和我的小伙伴们也讨论了这个主题,我受益匪浅啊…… 博文示例: 1. ...
- 高并发分布式系统中生成全局唯一Id汇总
数据在分片时,典型的是分库分表,就有一个全局ID生成的问题.单纯的生成全局ID并不是什么难题,但是生成的ID通常要满足分片的一些要求: 1 不能有单点故障. 2 以时间为序,或者ID里包含时间 ...
- 如何在高并发分布式系统中生成全局唯一Id(转)
http://www.cnblogs.com/heyuquan/p/global-guid-identity-maxId.html 又一个多月没冒泡了,其实最近学了些东西,但是没有安排时间整理成博文, ...
- (转)如何在高并发分布式系统中生成全局唯一Id
又一个多月没冒泡了,其实最近学了些东西,但是没有安排时间整理成博文,后续再奉上.最近还写了一个发邮件的组件以及性能测试请看 <NET开发邮件发送功能的全面教程(含邮件组件源码)> ,还弄了 ...
- 高并发分布式环境中获取全局唯一ID[分布式数据库全局唯一主键生成]
需求说明 在过去单机系统中,生成唯一ID比较简单,可以使用MySQL的自增主键或者Oracle中的sequence, 在现在的大型高并发分布式系统中,以上策略就会有问题了,因为不同的数据库会部署到不同 ...
随机推荐
- 浅谈WPF中的PreviewTextInput
今天在使用TextBox的TextInput事件的时候,发现无论如何都不能触发该事件,然后百思不得其解,最后在MSDN上找到了答案:TextInput 事件可能已被标记为由复合控件的内部实现进行处理. ...
- js中判断数据类型的4中方法
注意: js中数据类型有7种(number, boolean, string, null, undefined, object, Symbol(es6新增)) 原始数据类型: number, stri ...
- 线程同步Volatile与Synchronized(一)
volatile 一.volatile修饰的变量具有内存可见性 volatile是变量修饰符,其修饰的变量具有内存可见性. 可见性也就是说一旦某个线程修改了该被volatile修饰的变量,它会保证修改 ...
- Jquery实现检测用户输入用户名和密码不能为空
要求 1.用户名和密码为空点击登录时提示相应的提示 2.获取用户名输入框时,错误提示清除 思路 1.创建1个input-text标签和1个input-password标签,1个input-botton ...
- Android ProgressDialog 简单实用
ProgressDialog progressDialog; @SuppressLint("HandlerLeak") Handler handler1 = new Handler ...
- 洛谷P1007独木桥题解
题目 这个题看起来很难,但是只要理解了题目,一切都显得简单. 你只需想象出来每个人在碰撞之后仅仅是交换了灵魂, 这样一来,代码就好写了. 附代码: #include<iostream> # ...
- POJ 2245 Addition Chains(算竞进阶习题)
迭代加深dfs 每次控制序列的长度,依次加深搜索 有几个剪枝: 优化搜索顺序,从大往下枚举i, j这样能够让序列中的数尽快逼近n 对于不同i,j和可能是相等的,在枚举的时候用过的数肯定不会再被填上所以 ...
- wstngfw 初始化的一些配置
wstngfw 初始化的一些配置 1. 引导界面 2. 命令行菜单界面 3. Assign Interfaces (分配接口) Should VLANs be set up now [y|n]? nW ...
- mysql 备份数据语句
rem ******MySQL backup start********@echo offforfiles /p "D:\website\备份\数据库日常备份" /m backup ...
- 自学华为IoT物联网_05 能源工业物联网常见问题及解决方案
点击返回自学华为IoT物流网 自学华为IoT物联网_05 能源工业物联网常见问题及解决方案 1. 1 能源工业--油田业务面临的三大挑战 故障处理不及时: 部分油田开采难道大.机械故障较多.现场发生的 ...