JAVA高并发情况下生成唯一订单号

qq_30726405 2018-01-18 10:18:28


import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicInteger;

/**
* 高并发情况下获取订单号
*
* @author liuhongbing
*
*/
public final class OrderUtil {

private static final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
private static final AtomicInteger atomicInteger = new AtomicInteger(1000000);

/**
* 创建不连续的订单号
*
* @param no
* 数据中心编号
* @return 唯一的、不连续订单号
*/
public static synchronized String getOrderNoByUUID(String no) {
Integer uuidHashCode = UUID.randomUUID().toString().hashCode();
if (uuidHashCode < 0) {
uuidHashCode = uuidHashCode * (-1);
}
String date = simpleDateFormat.format(new Date());
return no + date + uuidHashCode;
}

/**
* 获取同一秒钟 生成的订单号连续
*
* @param no
* 数据中心编号
* @return 同一秒内订单连续的编号
*/
public static synchronized String getOrderNoByAtomic(String no) {
atomicInteger.getAndIncrement();
int i = atomicInteger.get();
String date = simpleDateFormat.format(new Date());
return no + date + i;
}
}
...全文
5140 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
我爱吻篮板 2018-01-22
  • 打赏
  • 举报
回复
请问下1楼 为什么不使用于 集群环境,麻烦告知下
Inhibitory 2018-01-22
  • 打赏
  • 举报
回复
试试这个吧,成熟的方案:分布式 ID 生成算法 Snowflake
分布式系统中,有一些需要使用全局唯一 ID 的场景,这种时候为了防止 ID 冲突可以使用 36 位的 UUID,但是 UUID 有一些缺点,首先他相对比较长,另外 UUID 一般是无序的字符串。

有些时候我们希望能使用简单一些的 ID,并且希望 ID 能够按照时间有序生成,为了解决这个问题,Twitter 发明了 SnowFlake 算法,不依赖第三方介质例如 Redis、数据库,本地生成程序生成分布式自增 ID,这个 ID 只能保证在工作组中的机器生成的 ID 唯一,不能像 UUID 那样保证时空唯一。

Snowflake 把时间戳、工作组 ID、工作机器 ID、自增序列号组合在一起,生成一个 64bits 的整数 ID,能够使用 70 年,每台机器每秒可产生约 25 万个 ID。

Snowflake 生成的 ID 的 bit 结构如下:


实现可访问 http://qtdebug.com/java-snowflake/
maradona1984 2018-01-18
  • 打赏
  • 举报
回复
SimpleDateFormat 是线程不安全的,AtomicInteger是线程安全的,所以你只需要处理SimpleDateFormat的线程安全问题,建议用TheadLocal保存SimpleDateFormat对象,可以把synchronized关键字去掉 这个代码不支持集群环境
qq_24269967 2018-01-18
  • 打赏
  • 举报
回复
点击新增的时候生成一个单据号,不要在保存的时候生成单据号就OK,之前也遇见了!

67,535

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧