Commit 3e966f73 authored by zhiguo.liu's avatar zhiguo.liu

# 创建基本 pom 文件并加入ID生产器

parents
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.quantgroup</groupId>
<artifactId>baitiao-commons</artifactId>
<version>0.0.1</version>
<packaging>jar</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.2.5.RELEASE</version>
</parent>
<dependencies>
<!-- apache commons start -->
<dependency>
<groupId>commons-cli</groupId>
<artifactId>commons-cli</artifactId>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
</dependency>
<!-- apache commons start -->
<!-- spring start -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-redis</artifactId>
</dependency>
<!-- spring end -->
<!-- log start -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
<!-- log end -->
<!-- lombok start -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- lombok end -->
<!-- gson start -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
<!-- gson end -->
<!-- hashids start -->
<dependency>
<groupId>org.hashids</groupId>
<artifactId>hashids</artifactId>
</dependency>
<!-- hashids end -->
<!-- joda start -->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
</dependency>
<!-- joda end -->
<!-- google guava start -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</dependency>
<!-- google guava start -->
<!-- jackson-databind start -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<!-- jackson-databind end -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>19.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
\ No newline at end of file
package cn.quantgroup.xyqb.Utils;
import com.google.common.base.Stopwatch;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
/**
* Created by liuzhiguo1 on 2017/5/18.
*/
@Component
public class IDGenerator {
private static final String REDIS_WORK_ID_KEY = "GLOBAL:WORK:ID:";
private static final String ID_FORMAT = "yyyyMMddHHmmss";
// data center,默认为 1
private static int DATA_CENTER_ID = 1;
private static int WORKER_ID = 0;
// 最高支持同时1W台机器
private static final int MAX_WORK_ID = 10000;
// 最高每秒发号 100w
private static final int MAX_COUNT = 999999;
private static long COUNTER = 0L;
private static long MAX_TIME_SECOND = 0L;
// 当前时间戳字符串
private static String CURRENT_TIME_STR;
// Worker ID 字符串
private static String WORKER_ID_STR;
// data center 字符串
private static String DATA_CENTER_STR;
@Autowired
private StringRedisTemplate redis;
public static void setDataCenterId(int dataCenterId) {
DATA_CENTER_ID = dataCenterId;
}
@PostConstruct
public void init() {
WORKER_ID = (int) (redis.opsForValue().increment(REDIS_WORK_ID_KEY + DATA_CENTER_ID, 1) % MAX_WORK_ID);
WORKER_ID_STR = String.format("%04d", WORKER_ID);
DATA_CENTER_STR = String.format("%03d", DATA_CENTER_ID);
}
/**
* 1. 需要获取 dataCenterId 和 workeId
*/
public synchronized static String getId(String prefix) {
Date now = new Date();
Long timeSecond = now.getTime() / 1000;
if (timeSecond > MAX_TIME_SECOND) {
MAX_TIME_SECOND = timeSecond;
CURRENT_TIME_STR = new SimpleDateFormat(ID_FORMAT, Locale.SIMPLIFIED_CHINESE).format(now);
COUNTER = 0;
}
// 达到计数器上上限,或时间回退时, 休眠半秒并重试
if (COUNTER >= MAX_COUNT || timeSecond < MAX_TIME_SECOND) {
try {
Thread.sleep(500);
return getId(prefix);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return prefix + CURRENT_TIME_STR + DATA_CENTER_STR + WORKER_ID_STR + String.format("%06d", ++COUNTER);
}
public static void main(String[] args) throws InterruptedException {
WORKER_ID = 1;
WORKER_ID_STR = String.format("%04d", WORKER_ID);
DATA_CENTER_STR = String.format("%03d", DATA_CENTER_ID);
Stopwatch watch = Stopwatch.createStarted();
CountDownLatch countDownLatch = new CountDownLatch(100);
ConcurrentHashMap hashMap = new ConcurrentHashMap();
for (int i = 0; i < 100; i++) {
new Thread(() -> {
for (int j = 0; j < 1000; j++) {
hashMap.put(getId("BT"), "xx");
}
countDownLatch.countDown();
}).start();
}
countDownLatch.await();
watch.stop();
System.out.println(hashMap.size() + ", " + watch.elapsed(TimeUnit.MILLISECONDS) + "ms");
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment