Java零基础入门到高级应用-订单生成策略

1、通过UUID【通用唯一识别码】进行策略生成:

说明:UUID 的目的,是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定。

UUID的组成:日期+时间+适中序列+机器码(全局唯一的IEEE机器识别号,如果有网卡,从网卡MAC地址获得,没有网卡以其他方式获得

获取OrderId的接口:

public interface OrderId {
public String getOrderId();

}

通过UUID方式获取实现类:

public class OrderIdByUUID implements OrderId {
@Override
public String getOrderId() {
UUID randomId = UUID.randomUUID();
System.out.println(randomId.toString());
return randomId.toString();
}

}

JUnit单元测试:

        OrderIdByUUID orderIdByUUID = new OrderIdByUUID();

A:顺序执行生成测试结果:

@Test
public void test() {
//顺序策略生成
System.out.println("********** get orderId start **********");
for (int i = 0; i < 1000; i++) {
orderIdByUUID.getOrderId();//顺序一条一条执行
}
System.out.println("********** get orderId end **********");

}

B:多线程高并发执行测试结果:

private  CountDownLatch cdl = new CountDownLatch(500); //栅栏,类似发令枪
@Test
public void test() throws InterruptedException {
System.out.println("********** get orderId start **********");
//多线程高并发生成策略
for (int i = 0; i < 1000; i++) {
new Thread(new OrderThread()).start();//多线程情况下一条一条执行,并非是并发执行操作
cdl.countDown(); //计算方法,每一次调用数值减1
}
Thread.sleep(2000);
System.out.println("********** get orderId end **********");
}


private class OrderThread implements Runnable{
@Override
public void run() {
try {
cdl.await();//所有线程都在当前位置等待
} catch (InterruptedException e) {
e.printStackTrace();
}
orderIdByUUID.getOrderId();
}

}

说明:UUID方式生成策略优点:实现简单,不占用宽带;缺点:无序、不可读、查询慢

2、通过数据库自增进行策略生成:

说明:数据库(DB)自增方式生成策略优点:无代码递增;缺点:数据库单点故障、扩展瓶颈

例如:

在集群数据库中,三台数据库的自增生成策略可以是:

DB_1 [自增初始值:1,自增步长为3];其自增的值为:1、4、7、10...

DB_2 [自增初始值:2,自增步长为3];其自增的值为:2、5、8、11...

DB_3 [自增初始值:3,自增步长为3];其自增的值为:3、6、9、12...

说明:

1、若出现集群数据库的扩建,新增DB_4时,此时【自增初始值】和【自增步长值】设置存在困惑!

2、若出现DB_1、DB_2、DB_3的任意一台机器的服务挂了,则可能会导致所有服务的挂掉【即:数据库(DB)的单点故障】


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值