唯一序列号生成,自測支持高并发,不支持集群

序列号组成:前缀 + 日期 + 尾数

比如:ZC20140806000001

总共两个组成:一个枚举类。一个静态生成器。另外须要设计自己主动任务每日凌晨或其它时间重置一次尾数。

先上枚举类:

package com.boxmeal.base.constant.common;

import java.util.concurrent.atomic.AtomicInteger;
/**
 * 序列号生成枚举
 * @author bling
 *
 */
public enum SNEnum {

	// 订单编号
	SUIT("tcd",new AtomicInteger(0));

	private String prefix;

	private AtomicInteger count;

	private SNEnum(String prefix,AtomicInteger count) {
		this.prefix = prefix;
		this.count = count;
	}

	public void setPrefix(String prefix) {
		this.prefix = prefix;
	}

	public void setCount(AtomicInteger count) {
		this.count = count;
	}

	public String getPrefix() {
		return prefix;
	}

	public AtomicInteger getCount() {
		return count;
	}
}

枚举类是为了控制參数保证统一性。

再上生成器类:

package com.boxmeal.base.util;

import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.atomic.AtomicInteger;

import com.boxmeal.base.constant.common.SNEnum;

/**
 * 序列号生成器,每日自己主动从1開始增长
 * @author bling
 *
 */
public class SNGenerater {

	/**
	 * 日期格式化
	 */
	private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");

	/**
	 * 数字格式化
	 */
	private static final DecimalFormat decimalFormat = new DecimalFormat("000000");

	/**
	 * 序列号产生器
	 * @param sn
	 * @return
	 */
	public final static String genSuitSN(SNEnum sn){
		String prefix = sn.getPrefix();
		String dateStr = SNGenerater.dateFormat.format(new Date());
		String suffix = SNGenerater.decimalFormat.format(sn.getCount().incrementAndGet());
		return prefix + dateStr + suffix;
	}

	/**
	 * 重置序列号生成器:自己主动任务每日夜间00:00调用一次
	 */
	public final static void reset(){
		SNEnum[] snEnumAry = SNEnum.values();
		for(int i=0;i<snEnumAry.length;i++){
			snEnumAry[i].setCount(new AtomicInteger(0));
		}
	}

	public static void main(String[] args) {
		for(int i=0;i<100;i++){
			System.out.println(SNGenerater.genSuitSN(SNEnum.SUIT));
		}
		SNGenerater.reset();
		for(int i=0;i<100;i++){
			System.out.println(SNGenerater.genSuitSN(SNEnum.SUIT));
		}
	}

}

尽管在生成器方法没有加同步关键词,是由于尾数自增是原子操作。

測试类:

package com.boxmeal.test;

import com.boxmeal.base.constant.common.SNEnum;
import com.boxmeal.base.util.SNGenerater;

public class SNTest {

	class VisitThread implements Runnable{

		@Override
		public void run() {
			for(int i=0;i<100;i++){
				System.out.println(SNGenerater.genSuitSN(SNEnum.SUIT));
				try {
					Thread.sleep(20);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}

	public void test(){
		for(int i=0;i<20;i++){
			new Thread(new VisitThread()).start();
		}
	}

	public static void main(String[] args) {
		new SNTest().test();
	}

}

开了20个线程并发2000次訪问,測试结果没有发生反复。

时间: 2024-10-27 19:43:44

唯一序列号生成,自測支持高并发,不支持集群的相关文章

配置开发支持高并发TCP连接的Linux应用程序全攻略

http://blog.chinaunix.net/uid-20733992-id-3447120.html http://blog.chinaunix.net/space.php?uid=16480950&do=blog&id=103598 原文见:http://www.cppblog.com/flashboy/articles/47012.html1.修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到

Linux配置支持高并发TCP连接(socket最大连接数)

Linux配置支持高并发TCP连接(socket最大连接数)及优化内核参数 2011-08-09 15:20:58|  分类:LNMP&&LAMP|  标签:内核调优  文件系统调优  高并发调优  socket连接  ip_conntract  |字号大中小 订阅 1.修改用户进程可打开文件数限制在 Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个s

1支持高并发web服务器搭建

支持高并发web服务器搭建 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] CTCDN系统优化参数 关闭ipv6 避免放大攻击 开启恶意icmp错误消息保护 关闭路由转发 开启反向路径过滤 处理无源路由的包 关闭sysrq功能 core文件名中添加pid作为扩展名 开启SYN洪水攻击保护 修改消息队列长度 设置最大内存共享段大小bytes timewait的数量默认180000 系统同时保持TIME_WAIT的最大数量如果超过这个数字TIME_WAIT将立刻被清除并打印警

Tornado从入门到进阶 打造支持高并发的技术论坛

第1章 Tornado从入门到进阶 打造支持高并发的技术论坛-课程导学Tornado从入门到进阶 打造支持高并发的技术论坛-课程导学 第2章 开发环境搭建(会的可以略过本章,2-4要看下哦)本章节主要讲解搭建开发环境,包括navicat.pycharm.virtualenvwrapper的使用,在本章节也会重点介绍课程资源的下载和配置使用. 第3章 为什么要学习tornado很多人会把tornado和flask以及django相提并论,只是知道tornado是高并发的,但是因为对tornado的

支持高并发的IIS Web服务器常用设置

转一篇站长大人的文章 适用的IIS版本:IIS 7.0, IIS 7.5, IIS 8.0 适用的Windows版本:Windows Server 2008, Windows Server 2008 R2, Windows Server 2012 1.应用程序池(Application Pool)的设置:  General->Queue Length设置为65535(队列长度所支持的最大值) Process Model->Idle Time-out设置为0(不让应用程序池因为没有请求而回收)

redis单线程如何支持高并发

redis支持高并发的原因: redis是基于内存的,内存读写很快 redis的是单线程的,省去了很多多线程上下文切换的时间 redis虽然是单线程,但采用了IO多路复用技术,非阻塞IO,即多个网络连接复用一个线程,保证多连接的同时增加系统的吞吐量 redis的数据结构,采用hash,读取速度比较快 原文地址:https://www.cnblogs.com/volare/p/12276077.html

并发、高并发、集群的含义?

并发:多个用户同时向服务器发出请求,服务器会开启多个线程,每个线程服务一个用户 高并发:当用户量达到成千上万,会导致服务器资源不再充足,最终使服务器内存溢出 集群:可以解决高并发问题  集群将一个应用拷贝多份,搭在多台服务器(机器),多台服务器构成一个集群 原文地址:https://www.cnblogs.com/codeXi/p/11429871.html

面试官:你是如何使用JDK来实现自己的缓存(支持高并发)?

需求分析 项目中经常会遇到这种场景:一份数据需要在多处共享,有些数据还有时效性,过期自动失效.比如手机验证码,发送之后需要缓存起来,然后处于安全性考虑,一般还要设置有效期,到期自动失效.我们怎么实现这样的功能呢? 解决方案 使用现有的缓存技术框架,比如redis,ehcache.优点:成熟,稳定,功能强大:缺点,项目需要引入对应的框架,不够轻量. 如果不考虑分布式,只是在单线程或者多线程间作数据缓存,其实完全可以自己手写一个缓存工具.下面就来简单实现一个这样的工具. 先上代码: import j

15套java互联网架构师、高并发、集群、负载均衡、高可用、数据库设计、缓存、性能优化、大型分布式 项目实战视频教程

* { font-family: "Microsoft YaHei" !important } h1 { color: #FF0 } 15套java架构师.集群.高可用.高可扩 展.高性能.高并发.性能优化.Spring boot.Redis.ActiveMQ.Nginx.Mycat.Netty.Jvm大型分布 式项目实战视频教程 视频课程包含: 高级Java架构师包含:Spring boot.Spring  cloud.Dubbo.Redis.ActiveMQ.Nginx.Mycat