java,面对单据的流水号,避免重复和并发问题
先讲一下思路
把一批单号生成,放到内存(你要连续,就放缓存),然后通过加锁的方式,去控制并发和重复的问题,当只剩下几个单号的时候,再重新生成一批
OK,上代码
NO.1 首先得有个配置,定义每次生成多少个单据号出来(放缓存里,不够了再生成)
// 配置项属性:
// 列名: val(当前值) , interval (增长区间), n(倍数)
// 其中 val = val + interval * n
//
// 开始时 val = 1 , interval = 10 , n = 2 ==> [1 , 20] 把这个区间信息记录下来,当取到 20这个值时,就得更新配置信息,更新为如下:
// val = 21 , interval = 10 , n = 2 ==> [21 , 40] 此时,区间信息增加了,同样也是存起来.....以此类推....一直累加,一直获取
/**对应配置信息的封装类*/
public class SysConf {
//当前值
private long val;
//增长区间
private int interval;
//倍数
private int n;
public long getVal() {
return val;
}
public void setVal(long val) {
this.val = val;
}
public int getInterval() {
return interval;
}
public void setInterval(int interval) {
this.interval = interval;
}
public int getN() {
return n;
}
public void setN(int n) {
this.n = n;
}
}
NO.2 假设这个配置项是存在数据库(或缓存中) — 这里就模拟一下
/**对应的操作类, -- 即对配置信息进行查询和更新*/
public class DbData {
static SysConf sysConf;
public static SysConf query(){
sysConf = new SysConf();
//初始单据号为1
sysConf.setVal(1);
//增长区间设为5 (一般是固定值)
sysConf.setInterval(5);
//增长倍数设置为2 (一般是固定值)
sysConf.setN(2);
return sysConf;
}
public static SysConf update(){
//更新的时候,更新val就行了,因为 interval 和 n 一般都是固定值
long val = sysConf.getVal() + sysConf.getInterval() * sysConf.getN();
sysConf.setVal(val);
return sysConf;
}
}
NO.3 真正生成单据号的类
public class TicketNoTool {
//边界值(超过这个值,就得重新更新数据库)