背景

  早上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. 高性能存储之--快速理解redis(简版)
  2. 零基础入门学习Python22-递归2 斐波那契数列和汉诺塔
  3. poj 2689 大范围素数
  4. 程序直接控制I/O方式
  5. Unit testing Cmockery 简单使用
  6. 罗永浩最期待的游戏要来了 《Party Animals》10月上线
  7. Esxi自动化配置脚本
  8. qtp11安装及入门
  9. 如何让微信好友永远拉黑不了你?
  10. Android开发常用的模拟器
  11. 郑州市暂住证(居住证)、迁户口办理-2018年
  12. blendshape变形器详细解释
  13. 十月美剧精听总结 - 权力的游戏「Game of Throne」 黑袍纠察队「The boys」 老无所依「No Country for the old men」
  14. 机器人断脚_超强算法让机器人脚断了照样跑
  15. Mybatis(一)Mybatis的基本使用
  16. 图形编程丨图形绘制基础imgui篇—D3D9 HOOK 创建内部Imgui窗口
  17. rocketMQ的消息介绍、发送方式和消费方式
  18. 高质量作品集封面合集(含封面素材、字体包和作品集封面原始文档)
  19. Excel公式向导,不会函数也可以单条件求平均值
  20. 快手小筷子机器人_快手小快机器人设置 苹果手机小快机器人怎么弄

热门文章

  1. vue + vue-router + vue-resource 基于vue-cli脚手架 ---笔记
  2. 问题-[WIN8.132位系统]安装Win8.1 遇到无法升级.NET Framework 3.5.1
  3. 使用WIF实现单点登录Part I——Windows Identity Foundation介绍及环境搭建 -摘自网络...
  4. 我愿意参加Qcon 2010大会,你愿意吗?
  5. 风靡全球的GANs:一文看尽这“混世魔王”的“三生三世”
  6. 超强领先!Transformer图像复原效果显著!
  7. 收藏 | 神经网络debug 6大技巧!
  8. 独家总结 | 决策树算法Python实现(附代码详解及注释)
  9. 让你又爱又恨的推荐系统--程序猿篇
  10. 逐行创建、读取并写入txt(matlab) 生成文件夹里文件名的.bat文件