产品需求是为订单生成一个10位长度的订单号,可以包含字母和数组,字母不区分大小写。

我们可能想到雪花ID,是的,雪花ID设计很巧妙,但是长度太长不满足产品的需要,不过我们可以对雪花ID改造。

0000000000时间戳 机器ID 序列号

我们把10位分为3组:

第一组是前8位用做时间戳,由于是字母+数字组合,所以一位就能表示36个数字,0-9a-z,也就是36进制,36^8 = 2821109907456 毫秒 > 89年3652436001000 也就是精确到毫秒能用89年,不错啦。

第二组是机器ID,也是36进制,能用36个实例,基本够了。

第三组是序列号,也是36进制,那一个实例一毫秒最多36个订单号。

我们不难看出这不就是雪花的ID的变形吗,只不过我们支持字母+数字组合,所以就能缩小一些位数,是的,没错!

功能

我们再来看看上面我们提出的方案,基本能满足并发量不大的需求,当并发量实在太多可以多创建几个实例,一毫秒需要的订单号超过36个,那就再等下一毫秒呗。

如果就要钻牛角尖,就不愿意等下一毫秒,那我们就要对扩大第三组的限制了,如果再扩大一位就能每毫秒36X36=1296个了,如果再扩大一位那就能一毫秒36X36X36=46656个了,如果还不满足还可以继续,但是我觉得意义不大了。

扩展倒是很容易,但是产品得同意订单号位数变长啊,有的能同意,有的就难沟通了,所以这里我打算把每毫秒的最多数量做成能动态设置的。

另外,我们上面提到我们能用89年,如果从1970年开始那我们也就是能用到2059年,那很快了啊,怎么办?其实我们大可不必从1970年开始,从2000年开始不香吗?从2020年开始不更香吗? 这里我也打算做成可设置的,只是要注意下,项目开始就要决定从哪年开始,不然来回变化有可能重复咯。

使用

这里我们给出go版本的使用,很简单,https://github.com/xingliuhua/leaf

go get github.com/xingliuhua/leaf

err, node := leaf.NewNode(0)

if err != nil {

return

}

// 每毫秒200个

err = node.SetGenerateIDRate(200)

if err != nil {

return

}

startTime := time.Date(2020, 0, 0, 0, 0, 0, 0, time.UTC).UnixNano() / 1000000

// 从2020年开始

err = node.SetSince(startTime)

if err != nil {

return

}

for i := 0; i < 40; i++ {

err, id := node.NextId()

if err != nil {

return

}

fmt.Println(id)

}

当然node.SetSince,node.SetGenerateIDRate方法都可以不写,使用默认的也可以。

总结

站在巨人的肩膀上,我们能看得更远,说是对飚雪花ID,其实就是借鉴的雪花ID,大家也可以根据自己的需求自己实现雪花ID。

最后能帮忙点个star吗?https://github.com/xingliuhua/leaf

java高并发唯一订单号_高并发下唯一订单号生成器--雪花算法相关推荐

  1. mysql高并发和大流量_高并发-高并发和大流量解决方案

    高并发架构相关概念 并发 并发,在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,并且这几个程序都是在同一个处理机上运行,担任一个时刻点上只有一个程序在处理机上运行. 我们所说的 ...

  2. 高并发编程-线程通信_使用wait和notify进行线程间的通信2_多生产者多消费者导致程序假死原因分析

    文章目录 概述 jstack或者可视化工具检测是否死锁(没有) 原因分析 概述 高并发编程-线程通信_使用wait和notify进行线程间的通信 - 遗留问题 我们看到了 应用卡住了 .... 怀疑是 ...

  3. php 8位md5重复概率,高并发 php uniqid 用md5生成不重复唯一标识符方案

    高并发 php uniqid 用md5生成不重复唯一标识符方案 uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID. uniqid(prefix,more_entropy) prefi ...

  4. Java高并发秒杀API(四)之高并发优化

    Java高并发秒杀API(四)之高并发优化 1. 高并发优化分析 关于并发 并发性上不去是因为当多个线程同时访问一行数据时,产生了事务,因此产生写锁,每当一个获取了事务的线程把锁释放,另一个排队线程才 ...

  5. 高并发编程(四)高并发解决方案从前端到数据库

    1. 高并发和大流量解决方案 高并发架构相关概念 并发:在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理 ...

  6. 大型技术网站的技术( 高并发、大数据、高可用、分布式....)(一)

    面对高并发.大流量.高可用.海量数据.用户分布广泛.网络情况复杂这类网站系统我们如何应对??? 第一阶段   一台服务器不行就上多台服务器    1.应用程序与数据服务分离        将应用程序. ...

  7. 高并发面试 - 如何设计一个高并发系统?

    高并发面试 - 如何设计一个高并发系统? 面试题 如何设计一个高并发系统? 面试官心理分析 说实话,如果面试官问你这个题目,那么你必须要使出全身吃奶劲了.为啥?因为你没看到现在很多公司招聘的 JD 里 ...

  8. 服务器系统怎么做高并发,QPS 高并发 如何设计一个支撑高并发大流量的系统?...

    QPS 高并发 如何设计一个支撑高并发大流量的系统? 高并发架构相关概念 什么是并发? 并发是指并发的访问,也就是某个时间点,有多少个访问同时到来: 通常如果一个系统的日PV在千万以上,有可能是一个高 ...

  9. php小程序秒抢高并发,PHP 如何设计一个高并发高可用的秒杀或抢券系统

    一个大型网站应用一般都是从最初小规模网站甚至是单机应用发展而来的,为了让系统能够支持足够大的业务量,从前端到后端也采用了各种各样技术,前端静态资源压缩整合.使用CDN.分布式SOA架构.缓存.数据库加 ...

  10. Java实现库存防超卖_高并发场景-订单库存防止超卖

    背景 在电商系统中买商品过程,先加入购物车,然后选中商品,点击结算,即会进入待支付状态,后续支付. 过程需要检验库存是否足够,保证库存不被超卖. 场景一:买家需要购买数量可以多件 场景二:秒杀活动,到 ...

最新文章

  1. Response.Redirect() 跳转中的ThreadAbortException
  2. 树莓派3B+功耗测试、初体验、图形化配置树莓派3B+配置方法。Raspberry Pi 3B+测评...
  3. 237. 删除链表中的节点(C语言)
  4. 《VMware Virtual SAN权威指南》一2.2.4 容量层设备
  5. TJOI2018Party
  6. protobuf2和3同时安装_安装protobuf可能遇到的问题
  7. Drupal 自己定义主题实体 Theming Custom Entities
  8. 赤虹JSON模块 v1.0 麻雀虽小, 五脏俱全
  9. 《南溪的目标检测学习笔记》——目标检测的评价指标(mAP)
  10. 将 SPSS 分析技术应用于大数据
  11. 前端关系图谱插件_前端拓扑图插件选型对比
  12. Unity游戏开发学习路线
  13. 安森美推出新的高功率图腾柱PFC控制器,满足具挑战的能效标准
  14. PHPUnit的使用
  15. 将AutoCAD文件中圆形替换为六边形
  16. PYQT5(12)-基本窗口控件-窗口绘图类空间
  17. 微信支付--网页版-V3-(2)
  18. 【转】可在广域网部署运行的QQ高仿版 -- GG叽叽(源码)
  19. android开发出现错误:Failed to find configured root that contains
  20. linux档案权限655,Linux 的档案权限与目录配置

热门文章

  1. mand-mobile实现md-selector多选加搜索
  2. Linux 中设置计划任务(定时任务)
  3. 简单好用的桌面日历便签软件有哪些?
  4. 待支付模板html,待支付.html
  5. CSS实现平行四边形
  6. 数学函数最小值为什么可以通过导数=0来求出呢?
  7. mysql ndb_MySQL NDB Cluster概述
  8. 最新最全论文合集——基于背景知识的对话系统
  9. 组件分享之后端组件——超轻量级的工作流引擎go-workflow
  10. 软件开发程序员需要掌握的技术