当前位置:首页 » 快递单号 » 多并发时保证单号唯一

多并发时保证单号唯一

发布时间: 2021-03-12 04:40:01

❶ 400分求ASP.NET实现多用户并发产生不重复递增单号源码

有几种方法,我感觉最好的是在sqlserver里将你的单号设为自增型的,起始值为1001,默认增长1,当然如果你自己写的话,你可以每次插入新数据的时候都先查询一下这个字段的最大值然后+1,select top id from yourtable orderby id desc,然后把这个取到的值+1,插入到新的数据中去,不过这样会有小问题,比如你刚生成一个1005,有个别的表的数据外键指向了这个1005,此时你删除了1005这个值,但外键数据没有删除,你又添加了一个新数据,新数据id也是1005,会使数据混乱,所以感觉最好还是用第一种方法,数据库会自动替你递增并保证不冲突 追问当然不是简单的增加就能做到,如果是按日期例如2011102601(当天的日期加后面的两位流水码或者有字母和数字组合A1001等)
回答那你可以自己写一个专门用来生成单号的类,这个类负责用来生成你所规定格式的一个ID,并将此id保存下来,在下次需要生成的时候就按你的规律递加,为了执行效率,你的保存另起一线程去做,程序不关闭是使用一个静态变量来维护,当程序启动的时候加载这个静态变量,使用的时候跟据这个变量来生成后面的新变量,同时再将它保存起来就可以了

可以试试用文件 把第一个单号的整数往文件里写 在增加的时候去文件里去读 读出来转型把可用的整数部分取出来去叠加 在拼接前面的字符串
//新增单据方法
//单号
string newid = "";
FileStream fs = new FileStream("path", FileMode.Open);
StreamReader sr = new StreamReader(fs);
string id = sr.ReadToEnd();
sr.Close();
fs.Close();
int number = 0;
if (id!="")
{
number = Convert.ToInt32(id) + 1; //这里以加一为例
}
newid = "A" + number;//用你要的字符串去凭借 我以A为列
这个前提是第一次你要往文件里面去写开始的那个单号 只写整数部分 用substring 去截取

❷ 在高并发的情况下,不使用自增方式怎么生成唯一主键

自己建个表存储主键的当前值,然后每次从这里获取主键值,并增加1。
自增长其实也是有地方保存当前值的。

❸ 如何保证数据库集群中id的唯一性,假设每秒钟并发20万次

用雪花算法的工具类,1秒内可以生成26万不重复的值,数据库的主键不要自增,手动设置

packageentity;

importjava.lang.management.ManagementFactory;
importjava.net.InetAddress;
importjava.net.NetworkInterface;

/**
*<p>名称:IdWorker.java</p>
*<p>描述:分布式自增长ID</p>
*<pre>
*Twitter的SnowflakeJAVA实现方案
*</pre>
*核心代码为其IdWorker这个类实现,其原理结构如下,我分别用一个0表示一位,用—分割开部分的作用:
*1||0------00000---00000---000000000000
*在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间,
*然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识),
*然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。
*这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分),
*并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。
*<p>
*64位ID(42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加))
*
*@authorPolim
*/
publicclassIdWorker{
//时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动)
privatefinalstaticlongtwepoch=1288834974657L;
//机器标识位数
=5L;
//数据中心标识位数
=5L;
//机器ID最大值
=-1L^(-1L<<workerIdBits);
//数据中心ID最大值
=-1L^(-1L<<datacenterIdBits);
//毫秒内自增位
=12L;
//机器ID偏左移12位
=sequenceBits;
//数据中心ID左移17位
=sequenceBits+workerIdBits;
//时间毫秒左移22位
=sequenceBits+workerIdBits+datacenterIdBits;

=-1L^(-1L<<sequenceBits);
/*上次生产id时间戳*/
=-1L;
//0,并发控制
privatelongsequence=0L;

privatefinallongworkerId;
//数据标识id部分
privatefinallongdatacenterId;

publicIdWorker(){
this.datacenterId=getDatacenterId(maxDatacenterId);
this.workerId=getMaxWorkerId(datacenterId,maxWorkerId);
}
/**
*@paramworkerId
*工作机器ID
*@paramdatacenterId
*序列号
*/
publicIdWorker(longworkerId,longdatacenterId){
if(workerId>maxWorkerId||workerId<0){
(String.format("workerIdcan'tbegreaterthan%dorlessthan0",maxWorkerId));
}
if(datacenterId>maxDatacenterId||datacenterId<0){
(String.format("datacenterIdcan'tbegreaterthan%dorlessthan0",maxDatacenterId));
}
this.workerId=workerId;
this.datacenterId=datacenterId;
}
/**
*获取下一个ID
*
*@return
*/
publicsynchronizedlongnextId(){
longtimestamp=timeGen();
if(timestamp<lastTimestamp){
thrownewRuntimeException(String.format("Clockmovedbackwards.Refusingtogenerateidfor%dmilliseconds",lastTimestamp-timestamp));
}

if(lastTimestamp==timestamp){
//当前毫秒内,则+1
sequence=(sequence+1)&sequenceMask;
if(sequence==0){
//当前毫秒内计数满了,则等待下一秒
timestamp=tilNextMillis(lastTimestamp);
}
}else{
sequence=0L;
}
lastTimestamp=timestamp;
//ID偏移组合生成最终的ID,并返回ID
longnextId=((timestamp-twepoch)<<timestampLeftShift)
|(datacenterId<<datacenterIdShift)
|(workerId<<workerIdShift)|sequence;

returnnextId;
}

privatelongtilNextMillis(finallonglastTimestamp){
longtimestamp=this.timeGen();
while(timestamp<=lastTimestamp){
timestamp=this.timeGen();
}
returntimestamp;
}

privatelongtimeGen(){
returnSystem.currentTimeMillis();
}

/**
*<p>
*获取maxWorkerId
*</p>
*/
(longdatacenterId,longmaxWorkerId){
StringBuffermpid=newStringBuffer();
mpid.append(datacenterId);
Stringname=ManagementFactory.getRuntimeMXBean().getName();
if(!name.isEmpty()){
/*
*GETjvmPid
*/
mpid.append(name.split("@")[0]);
}
/*
*MAC+PID的hashcode获取16个低位
*/
return(mpid.toString().hashCode()&0xffff)%(maxWorkerId+1);
}

/**
*<p>
*数据标识id部分
*</p>
*/
(longmaxDatacenterId){
longid=0L;
try{
InetAddressip=InetAddress.getLocalHost();
NetworkInterfacenetwork=NetworkInterface.getByInetAddress(ip);
if(network==null){
id=1L;
}else{
byte[]mac=network.getHardwareAddress();
id=((0x000000FF&(long)mac[mac.length-1])
|(0x0000FF00&(((long)mac[mac.length-2])<<8)))>>6;
id=id%(maxDatacenterId+1);
}
}catch(Exceptione){
System.out.println("getDatacenterId:"+e.getMessage());
}
returnid;
}


publicstaticvoidmain(String[]args){
//推特26万个不重复的ID
IdWorkeridWorker=newIdWorker(0,0);
for(inti=0;i<2600;i++){
System.out.println(idWorker.nextId());
}
}

}

❹ 并发,怎么保证数据库的数据唯一性

1、可考虑将获取主键那个方法设置成同步的方式,所有的线程都需要同步获取主键。
2、负责主键的类一次生成100个主键(根据需要自己设定),放到一个Queue里,一个线程拿走一个就从Queue里移除一个,同时生成新的主键放入到Queue里。

❺ 如何在高并发分布式系统中生成全局唯一Id

  1. c# 中的 Guid 就是唯一的,它保证对在同一时空中的所有机器都是唯一的.

    据我所知,它也会产生碰撞,但是概率极小,完全可以不用理会的小。

  2. 可以用现有的支持原子操作的分布式数据库,

    例:Redis 很多网站用Redis 的原子性来生成唯一标识符

  3. 我们可以用本机的Mac地址,硬盘序列号,本地最大标识符来拼接出唯一。

    Mac 可被修改,硬盘序列号也有可能不唯一,但是这三样拼接在一起,碰撞的概率很小的

    Md5 也会碰撞,不是么?

❻ java web项目 订单号问题

有啥困难么?数据库中的订单号为主键,设置为自增(恕我不知道是否有此功能),这样就可以了。
拿Hibernate操作Oracle数据库,对于订单的主键订单号使用sequence,然后在数据库中定义对应的sequence就可以了啊。。。。
其他的数据库我不清楚。或者调用存储过程,在存储过程中实现类似的功能即可。
思路就是这样的。因为数据库是唯一的,因此可以通过数据库本身的唯一性避免多服务的冲突

❼ mysql 利用唯一索引Unique 高并发创建不重复唯一订单号是否和兴

订单号建索引挺好的啊 ,这样查询还快

❽ 如何保证生成的订单号的唯一性

订单号不能采用时间戳的形式,因为不可能精确到秒,那样订单号过长 这种情况下只能在数据库这端进行控制,但是也没有看到数据库有类似oracle的序列 问题补充:如果每次都去数据库中查询的话效率就有问题了 问题补充:guoxu0514 写道担心效率问题的话,你可以考虑用缓存来解决,不会有什么事儿都有两全其美的解决办法。缓存也有问题,比如无法保证集群环境下订单号的唯一性 问题补充:nixiangyan 写道直接交个数据库管理不久行了吗这种情况下只能在数据库这端进行控制,但是也没有看到数据库有类似oracle的序列 如果将用过的订单号插到数据库中,每次取最大的,效率上会不会有问题 问题补充:nixiangyan 写道其实 我感觉吧,效率是相对的,当你提出某种要求的时候实质上很大的可能是在牺牲效率,交个数据库管理如果是自增的话,你可能会说订单号太单一,如果使用时间你说太长,还有使用时间为什么不能精确到秒?可以解释一下吗? 我感觉做软件不能太在意效率了,呵呵,主要是客户给一定的规则,精确到秒的话订单太长了,效率问题倒是可以先不考虑 问题补充:hu437 写道可以这样做的,取最大的,不一定要是从源表里面取的,比如现在有一个订单表,我再加一个计数表 当每生成一个订单,我就同时将这个最大的订单号存到计数表里面,计数表里面可以只有两个字段,一个叫计数内容,一个叫计数值

❾ 高并发时如何生成唯一编号

使用uuid。uuid的算法是生成全球唯一的id

热点内容
在菲律宾用什么软件看国内电影 发布:2024-08-18 19:45:19 浏览:95
不是现代主义电影的是 发布:2024-08-18 16:26:58 浏览:792
在船上吃人的电影是哪一部 发布:2024-08-18 15:33:07 浏览:268
丁咚的电影 发布:2024-08-18 14:47:05 浏览:429
86.mm。kk 发布:2024-08-18 13:59:40 浏览:39
箱子男电影在线免费看 发布:2024-08-18 06:38:34 浏览:592
玩命快递4迅雷下载 发布:2024-08-18 04:41:05 浏览:839
电影票取票码是序列号还是二维码 发布:2024-08-17 21:52:01 浏览:467
韩国我也隐藏了真相演员表 发布:2024-08-17 21:22:10 浏览:178
安达市隆美影院5月26日播放 发布:2024-08-17 20:37:58 浏览:976