求一个思路,不用uuid。还有其他方法吗,生成订单的不重复的流水号
insert into t_trading(trading_code) values(CONCAT('DD',DATE_FORMAT(now(),'%Y%m%d'),LPAD(LAST_INSERT_ID()+1,20,'0')))
唯一不会重复的就是时间,那么我觉得我们就要把算法中增加当前时间
201709180000000101
日期+userid+顺序号
可以参考数据库的UUID的取法,如果有并发时间一样会重复
数据库建一个SEQ,每次去得到这个序列号,然后用bigdecimal转成18位
订单号常见的几种方式:
1.利用数据库主键值产生一个自增长的订单号(订单号即数据表的主键)
2.日期+自增长数字的订单号(比如:2012040110235662)
3.产生随机的订单号(65865325365966)
4.字母+数字字符串式,字母有包含特别意义,C02356652
一般流水号,都是有一定要求的,如可代表时间,可描述先后顺序,因此最佳解决方案是:时间+序列;
这里时间好解决,就是simpledateformat 的使用。问题就在序列这块,需要使用到数据库,或者说是写硬盘,其中写硬盘效率低且难维护。因此建议还是数据库序列吧。
登录的主机ip地址+当前时间+每天的顺序号
软件包 java.util.concurrent.atomic下提供了相关的类,可以用来生成顺序号
参考如下代码的 编程思路 自己改改 就出来了,要开启事务,避免生成重复值
/**
* 获取固定长度自增值 每次获取 自动加1
* @param var 一维key
* @param var2 二维key 默认0
* @param length 自增值长度
* @return
*/
public static int getIncrementValue(String var, String var2, int length) {
var2 = var2 == null ? "0" : var2;
TransactionDao db = new TransactionDao(DbCode.ROOGO);
Integer val = null;
try {
db.update(" UPDATE `tab_sysconfig` SET `value` = (value + 1) WHERE var = ? and var2 = ? ", var, var2);
String v = db.getUnique("SELECT `value` FROM tab_sysconfig WHERE var = ? and var2 = ? ", var, var2);
if (v != null && v.length() == length)
val = Integer.valueOf(v);
} finally {
try {
db.commit();
} finally {
db.close();
}
}
if (val == null) {
val = new Double(Math.pow(10, length - 1)).intValue() + 1;
setValue(var, var2, String.valueOf(val));
}
return val.intValue();
}
时间yyyymmddhhmmss14位+4位随机数字
如果想碰撞更小减少时间位数,增加随机数位
Twitter 的 Snowflake idworker