Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
T
traffic-front
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wangxiaoming
traffic-front
Commits
418a6c80
Commit
418a6c80
authored
Jun 22, 2018
by
frank.xa.zhang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
save id generator locally
parent
e4a54c9b
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
128 additions
and
0 deletions
+128
-0
SnowFlake.java
...src/main/java/pwc/taxtech/atms/common/util/SnowFlake.java
+97
-0
DistributedIDService.java
...a/pwc/taxtech/atms/service/impl/DistributedIDService.java
+31
-0
No files found.
atms-api/src/main/java/pwc/taxtech/atms/common/util/SnowFlake.java
0 → 100644
View file @
418a6c80
package
pwc
.
taxtech
.
atms
.
common
.
util
;
public
class
SnowFlake
{
/**
* 起始的时间戳
*/
private
final
static
long
START_STAMP
=
1529337600000L
;
/**
* 每一部分占用的位数
*/
private
final
static
long
SEQUENCE_BIT
=
12
;
//序列号占用的位数
private
final
static
long
MACHINE_BIT
=
5
;
//机器标识占用的位数
private
final
static
long
DATA_CENTER_BIT
=
5
;
//数据中心占用的位数
/**
* 每一部分的最大值
*/
private
final
static
long
MAX_DATA_CENTER_NUM
=
-
1L
^
(-
1L
<<
DATA_CENTER_BIT
);
private
final
static
long
MAX_MACHINE_NUM
=
-
1L
^
(-
1L
<<
MACHINE_BIT
);
private
final
static
long
MAX_SEQUENCE
=
-
1L
^
(-
1L
<<
SEQUENCE_BIT
);
/**
* 每一部分向左的位移
*/
private
final
static
long
MACHINE_LEFT
=
SEQUENCE_BIT
;
private
final
static
long
DATA_CENTER_LEFT
=
SEQUENCE_BIT
+
MACHINE_BIT
;
private
final
static
long
TIMESTAMP_LEFT
=
DATA_CENTER_LEFT
+
DATA_CENTER_BIT
;
private
long
dataCenterId
;
//数据中心
private
long
machineId
;
//机器标识
private
long
sequence
=
0L
;
//序列号
private
long
lastStamp
=
-
1L
;
//上一次时间戳
public
SnowFlake
(
long
dataCenterId
,
long
machineId
)
{
if
(
dataCenterId
>
MAX_DATA_CENTER_NUM
||
dataCenterId
<
0
)
{
throw
new
IllegalArgumentException
(
"dataCenterId can't be greater than MAX_DATA_CENTER_NUM or less than 0"
);
}
if
(
machineId
>
MAX_MACHINE_NUM
||
machineId
<
0
)
{
throw
new
IllegalArgumentException
(
"machineId can't be greater than MAX_MACHINE_NUM or less than 0"
);
}
this
.
dataCenterId
=
dataCenterId
;
this
.
machineId
=
machineId
;
}
/**
* 产生下一个ID
*
* @return id
*/
public
synchronized
long
nextId
()
{
long
currStamp
=
getNewStamp
();
if
(
currStamp
<
lastStamp
)
{
throw
new
RuntimeException
(
"Clock moved backwards. Refusing to generate id"
);
}
if
(
currStamp
==
lastStamp
)
{
//相同毫秒内,序列号自增
sequence
=
(
sequence
+
1
)
&
MAX_SEQUENCE
;
//同一毫秒的序列数已经达到最大
if
(
sequence
==
0L
)
{
currStamp
=
getNextMill
();
}
}
else
{
//不同毫秒内,序列号置为0
sequence
=
0L
;
}
lastStamp
=
currStamp
;
return
(
currStamp
-
START_STAMP
)
<<
TIMESTAMP_LEFT
//时间戳部分
|
dataCenterId
<<
DATA_CENTER_LEFT
//数据中心部分
|
machineId
<<
MACHINE_LEFT
//机器标识部分
|
sequence
;
//序列号部分
}
private
long
getNextMill
()
{
long
mill
=
getNewStamp
();
while
(
mill
<=
lastStamp
)
{
mill
=
getNewStamp
();
}
return
mill
;
}
private
long
getNewStamp
()
{
return
System
.
currentTimeMillis
();
}
public
static
void
main
(
String
[]
args
)
{
SnowFlake
snowFlake
=
new
SnowFlake
(
1
,
1
);
for
(
int
i
=
0
;
i
<
(
1
<<
12
);
i
++)
{
System
.
out
.
println
(
snowFlake
.
nextId
());
}
}
}
atms-api/src/main/java/pwc/taxtech/atms/service/impl/DistributedIDService.java
0 → 100644
View file @
418a6c80
package
pwc
.
taxtech
.
atms
.
service
.
impl
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.stereotype.Service
;
import
pwc.taxtech.atms.common.util.SnowFlake
;
import
javax.annotation.PostConstruct
;
@Service
public
class
DistributedIDService
extends
BaseService
{
@Value
(
"${distributed_id_datacenter}"
)
private
Integer
dataCenterId
;
@Value
(
"${distributed_id_machine}"
)
private
Integer
machineId
;
private
SnowFlake
snowFlake
;
@PostConstruct
public
void
init
()
{
snowFlake
=
new
SnowFlake
(
dataCenterId
,
machineId
);
}
/**
* 获取ID
*
* @return long
*/
public
long
nextId
()
{
return
snowFlake
.
nextId
();
}
}
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