方案一:
如果没有并发的话,订单号只在一个线程中产生,不同订单的时间戳不同,
时间戳+随机数(自增数)区分订单
如果有并发的话,并且订单号在同一台主机产生多个进程,只要把进程的ID添加到序列号中就可以保证订单号唯一。
如果有并发,订单在不同主机中,把IP地址 CPU序列号 能区分的号码添加到序列号中就能保证唯一。
方案二:
时间戳+用户ID+随机数+乐观锁
方案三:
可以用redis的原子递增,做高可用集群
方案四:
java自带的UUID
实例代码
java中获取线程ID
Thread.currentThread().getId()
java 获取进程 ID
1. //java获取进程ID 2. RuntimeMXBean runtime = ManagementFactory.getRuntimeMXBean(); 3. Field jvm = runtime.getClass().getDeclaredField("jvm"); 4. jvm.setAccessible(true); 5. VMManagement mgmt = (VMManagement) jvm.get(runtime); 6. Method pidMethod = mgmt.getClass().getDeclaredMethod("getProcessId"); 7. pidMethod.setAccessible(true); 8. int pid = (Integer) pidMethod.invoke(mgmt);
java 获取 mac 地址
1. InetAddress ia = InetAddress.getLocalHost(); 2. byte[] mac = NetworkInterface.getByInetAddress(ia).getHardwareAddress(); 3. String macStr = DatatypeConverter.printHexBinary(mac);