Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
C
commons
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
3
Merge Requests
3
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
DevOps
commons
Commits
3e966f73
Commit
3e966f73
authored
May 22, 2017
by
zhiguo.liu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
# 创建基本 pom 文件并加入ID生产器
parents
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
242 additions
and
0 deletions
+242
-0
pom.xml
pom.xml
+134
-0
IDGenerator.java
src/main/java/cn/quantgroup/xyqb/Utils/IDGenerator.java
+108
-0
No files found.
pom.xml
0 → 100644
View file @
3e966f73
<?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
src/main/java/cn/quantgroup/xyqb/Utils/IDGenerator.java
0 → 100644
View file @
3e966f73
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"
);
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment