背景

  早上QA小姐姐发现线上有个报错,过去一看,采购单号生成异常,后台duplicate key,也就是说生成了重复单号。这个模块之前不是我写的(这个哥们刚离职了),而后来的领料单号的生成我重新写了下,规则比较简单,重复率也比较低,大家有好的方案也可以分享下。

正文

  首先,背景是我们这里需要一个18位的单号(有多种类型:采购、发货、领料等),订单号之类的基本规则:唯一、无序(特殊情况会要求排序、增量等),我们这里定了相应的格式:4位shopId + 2位订单类型编码 + 8位年月日 + 4位字符,

例如:0004CK201805080005。而原来哥们最后四位是用递增来生成的,0001之类的,而且是从数据库读取最新生成的单号,截取最后四位然后加1,这样的问题很明显:多机器(集群)时,或者有并发时很容易生成重复单号导致报错,由于我们这里是内部管理系统,并发量不大,但还是发生报错。还有连续生成的规则,容易被恶意爬取推算出每日的单量等。

  然后,基于原来的规则,我把最后的4为字符改为随机,加入了0-9、A-Z共36个字符,方法如下:

    private static String[] chars = new String[] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D","E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y","Z" };/*** * @Description:生成指定位数随机字符* @param length*            位数* @return String* @exception:* @author: wws* @time:2018年5月8日 下午4:18:58*/private static String generateCode(int length) {StringBuilder shortBuffer = new StringBuilder();String uuid = UUID.randomUUID().toString().replace("-", "");for (int i = 0; i < length; i++) {String str = uuid.substring(i * 4, i * 4 + 4);int x = Integer.parseInt(str, 16);shortBuffer.append(chars[x % chars.length]);}return shortBuffer.toString();}

  这样我们生成的4位数的组合理论上重复的概率是很低的,适合中小的系统使用。

其他生成方法

  1. 使用mysql自增id,优点:简单、保证唯一性;缺点:过于简单、且数据日渐增加、没有区分度(不同业务订单类型无法分辨)等

  2. UUID存储,优点:生成简单、无消耗;缺点:长度过长、没区分度、无序(数据位置无规则,可能影响到索引)、不安全(基于mac地址生成,可能导致泄露)等

  3. snowflake(Twitter),优点:不依赖数据库、性能好、单机递增;缺点:强依赖机器时钟、分布式下可能不同步等

  4. 美团的leaf(https://tech.meituan.com/MT_Leaf.html)。美团这里提供的思路很清晰,针对取号、时钟回拨等问题进行了分析,也提供了相应的解决(预警)方案,推荐大家看下。

转载于:https://www.cnblogs.com/wangwansong/p/9468443.html

订单号生成的一些想法相关推荐

  1. 电商平台订单号生成策略

    订单是整个电子商务的核心.整个电子商务的流程也是围绕订单的状态执行的.这篇博客主要向大家介绍订单号的生成方式. 现在大型电商网站大多都有好几种下单途径.比如:通过Web网站下单,通过打电话到呼叫中心下 ...

  2. Python模拟订单号生成

    模拟订单号生成 为了产生不冲突的订单号,本次测试订单生成逻辑比较简单:当天时间拼接自增数列 from datetime import datetime def set_flow():base_code ...

  3. java唯一订单号_java web在高并发和分布式下实现订单号生成唯一的解决方案

    方案一: 如果没有并发,订单号只在一个线程内产生,那么由于程序是顺序执行的,不同订单的生成时间戳正常不同,因此用时间戳+随机数(或自增数)就可以区分各个订单.如果存在并发,且订单号是由一个进程中的多个 ...

  4. 快速订单号生成(两秒左右10万条数据无重复)

    订单号生成 在开发当中我想大部分程序员都会做商城类的项目,其中订单号是一个相对比较重要的数据,在用户下单是不允许有重复订单生成的. 我给大家提供了一个生成订单的方法,希望对您有所帮助!!!!!!!!! ...

  5. 快速分辨订单号生成工具

    为了人工可以快速分辨订单号是下单还是退款.来自哪家支付机构等 /*** 微信订单号生成* @param userId* @return*/public static String wxOrderNo( ...

  6. java并发订单号生成

    单机并发下订单的生成策略,订单号以年月日开头序 import java.time.Instant; import java.util.HashSet; import java.util.Set; im ...

  7. 【案例 5-1】 模拟订单号生成

     Test类 package anli5_1; //模拟订单单号生成 public class Test {public static void main(String[] args) {int[]a ...

  8. [案例5-1]模拟订单号生成

    任务描述: 编写一个程序,模拟订单系统中订单号的生成.例如给定一个包括年月日以及毫秒值的数组arr={2019,0504,1101},将其拼接成字符串s:[201905041101].要求使用Stri ...

  9. android 订单生成规则,订单号生成方法

    package com.jae.impl; import java.text.ParseException; import java.text.SimpleDateFormat; import jav ...

最新文章

  1. 二级菜单从mysql中取_MyEclipes中如何如何让通过读取Mysql中的数据来实现二级菜单分类...
  2. 使用openssl生成rsa公钥和私钥
  3. volatile关键字(三)
  4. php简单分词,php版简易中文分词实现 – mysql版本
  5. 多源迁移学习相关研究回顾
  6. 十年后,每天 24 小时离不开传感技术
  7. 金庸群侠传修改器链接服务器,《金庸群侠传》6合1版修改器
  8. 信捷plc485通信上位机_变频器、触摸屏和PLC建立MODBUS RTU通信的方法
  9. 洛谷p3376 网络流最大流模板题
  10. python 情感分析实例_使用python+机器学习方法进行情感分析(详细步骤)
  11. [24]Window PowerShell DSC学习系列---- 如何保护MOF文件里面存储的密码?
  12. php问答系统模板,tipask问答系统
  13. 通用计算机(PC)和手机是否属于嵌入式设备?(嵌入式的定义)-杂谈
  14. 受力分析软件_学了那么多力学,怎么还是不会做有限元分析?
  15. 数据运营与数据分析闲谈
  16. java 科学计数法位数_科学记数法android java
  17. 解除OA系统Word文档不能修改编辑问题
  18. 无人机快速三维建模平台
  19. 吼 困 鸭
  20. 【linux】Could not update ICEauthority file /home/xxx/.ICEauthority问题解决

热门文章

  1. mac 终端 svn 命令
  2. 京东探索研究院 34 篇论文入选 CVPR 2022
  3. 超过100G的CVPR 2020 图像匹配挑战赛数据下载!
  4. 2019全球程序员薪酬报告:软件开发比机器学习抢手!40岁后收入下滑
  5. ICCV 2019 | 商汤科技57篇论文入选,13项竞赛夺冠
  6. Reddit热议:为什么PyTorch比TensorFlow更快?
  7. 零基础快速入门python教程,结合新手练习的5大项目
  8. 零基础学习Python文本处理
  9. java 日志 异步_log4j 详解异步日志的配置和测试
  10. CVPR | 基于LiDAR的3D物体检测新框架