加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java生成全局唯一ID代码演示

发布时间:2020-12-15 06:54:03 所属栏目:Java 来源:网络整理
导读:看了GitHub上的两个生成唯一ID的算法程序(一个出自百度,一个出自美团),打算运行着试试看,至于原理什么的文档上讲得很详细了,此处不再一一粘贴了,此处只演示代码 https://github.com/baidu/uid-generator https://github.com/zhuzhong/idleaf 百度UID

看了GitHub上的两个生成唯一ID的算法程序(一个出自百度,一个出自美团),打算运行着试试看,至于原理什么的文档上讲得很详细了,此处不再一一粘贴了,此处只演示代码

https://github.com/baidu/uid-generator

https://github.com/zhuzhong/idleaf

百度UID生成器

Maven依赖

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 4     modelVersion>4.0.0</ 5 
 6     groupId>com.cjs.example 7     artifactId>uid-generator-demo 8     version>0.0.1-SNAPSHOT 9     packaging>jar10 
11     name12     description></13 
14     parent15         >org.springframework.boot16         >spring-boot-starter-parent17         >2.0.3.RELEASE18         relativePath/> <!-- lookup parent from repository -->
19     20 
21     properties22         project.build.sourceEncoding>UTF-823         project.reporting.outputEncoding24         java.version>1.825     26 
27     dependencies28         dependency29             >org.mybatis.spring.boot30             >mybatis-spring-boot-starter31             >1.3.232         33         34             >mysql35             >mysql-connector-java36             >5.1.4637         38 
39         40             >org.apache.commons41             >commons-collections442             >4.243         44         45             46             >commons-lang347             >3.748         49 
50         51             52             >spring-boot-starter-test53             scope>test54         55     56 
57     build58         plugins59             plugin60                 61                 >spring-boot-maven-plugin62             63         64     65 
66 project>

SQL脚本

DROP DATABASE IF EXISTS `mytest`;
CREATE DATABASE `mytest` ;
 3 use 4 TABLE  WORKER_NODE;
 5 TABLE WORKER_NODE
 6 (
 7     ID BIGINT NOT NULL AUTO_INCREMENT COMMENT 'auto increment id', 8     HOST_NAME VARCHAR(64) NULL COMMENT host name 9     PORT port10     TYPE INT node type: ACTUAL or CONTAINER11     LAUNCH_DATE DATE launch date12     MODIFIED TIMESTAMP modified time13     CREATED created timePRIMARY KEY(ID)
15 )COMMENT=DB WorkerID Assigner for UID Generator',ENGINE = INNODB;

mapper文件

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"mapper namespace="com.cjs.example.baidu.uid.worker.dao.WorkerNodeDAO"resultMap id="workerNodeRes"
 5                type="com.cjs.example.baidu.uid.worker.entity.WorkerNodeEntity" 6         id column="ID" jdbcType="BIGINT" property="id" />
 7         result ="HOST_NAME"="VARCHAR"="hostName"  8         ="PORT"="port"  9         ="TYPE"="INTEGER"="type" 10         ="LAUNCH_DATE"="DATE"="launchDate" 11         ="MODIFIED"="TIMESTAMP"="modified" 12         ="CREATED"="created" 13     resultMap14 
15     insert ="addWorkerNode" useGeneratedKeys="true" keyProperty="id"
16         parameterType17         INSERT INTO WORKER_NODE
18         (HOST_NAME,1)">19         PORT,1)">20         TYPE,1)">21         LAUNCH_DATE,1)">22         MODIFIED,1)">23         CREATED)
24         VALUES (
25         #{hostName},1)">26         #{port},1)">27         #{type},1)">28         #{launchDate},1)">29         NOW(),1)">30         NOW())
31     insert32 
33     select ="getWorkerNodeByHostPort" resultMap="workerNodeRes"34         SELECT
35         ID,1)">36         HOST_NAME,1)">37 38 39 40 41         CREATED
42         FROM
43         WORKER_NODE
44         WHERE
45         HOST_NAME = #{host} AND PORT = #{port}
46     select47 mapper>

application.yml配置

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mytest
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver
mybatis:
  mapper-locations: classpath:mapper/*Mapper.xml

Spring Bean配置

package com.cjs.example;
 2 
import com.cjs.example.baidu.uid.impl.CachedUidGenerator;
 com.cjs.example.baidu.uid.impl.DefaultUidGenerator;
 com.cjs.example.baidu.uid.worker.DisposableWorkerIdAssigner;
 com.cjs.example.baidu.uid.worker.WorkerIdAssigner;
 7  org.springframework.beans.factory.annotation.Autowired;
 8  org.springframework.boot.SpringApplication;
 9  org.springframework.boot.autoconfigure.SpringBootApplication;
10  org.springframework.context.annotation.Bean;
11  org.springframework.jdbc.core.JdbcTemplate;
12  org.springframework.transaction.annotation.EnableTransactionManagement;
14 @EnableTransactionManagement
15 @SpringBootApplication
16 public class UidGeneratorDemoApplication {
17 
18     static void main(String[] args) {
19         SpringApplication.run(UidGeneratorDemoApplication.    }
21 
    @Autowired
23     private WorkerIdAssigner workerIdAssigner;
24 
    @Bean
26     public DefaultUidGenerator defaultUidGenerator() {
27         DefaultUidGenerator defaultUidGenerator = new DefaultUidGenerator();
        defaultUidGenerator.setWorkerIdAssigner(workerIdAssigner);
29         defaultUidGenerator.setTimeBits(29);
30         defaultUidGenerator.setWorkerBits(2131         defaultUidGenerator.setSeqBits(1332         defaultUidGenerator.setEpochStr("2018-07-21"return defaultUidGenerator;
35 
37      DisposableWorkerIdAssigner disposableWorkerIdAssigner() {
38         return  DisposableWorkerIdAssigner();
40 
42      CachedUidGenerator cachedUidGenerator() {
43         CachedUidGenerator cachedUidGenerator =  CachedUidGenerator();
        cachedUidGenerator.setWorkerIdAssigner(workerIdAssigner);
45         cachedUidGenerator.setTimeBits(2946         cachedUidGenerator.setWorkerBits(2147         cachedUidGenerator.setSeqBits(1348         cachedUidGenerator.setEpochStr("2018-07-21"49          cachedUidGenerator;
50 51 
52 }

测试

 com.cjs.example.meituan.idleaf.IdLeafService;
 org.junit.Test;
 org.junit.runner.RunWith;
 org.springframework.beans.factory.annotation.Qualifier;
 org.springframework.boot.test.context.SpringBootTest;
 org.springframework.test.context.junit4.SpringRunner;
12 
13 @RunWith(SpringRunner.)
@SpringBootTest
 UidGeneratorDemoApplicationTests {
16 
18     @Qualifier("defaultUidGenerator" DefaultUidGenerator defaultUidGenerator;
22     @Qualifier("cachedUidGenerator" CachedUidGenerator cachedUidGenerator;
27 
    @Test
29      testSerialGenerate() {
30         long uid = defaultUidGenerator.getUID();
31         System.out.println(uid);
32         System.out.println(defaultUidGenerator.parseUID(uid));
33 34 
36      testSerialGenerate2() {
 cachedUidGenerator.getUID();
        System.out.println(cachedUidGenerator.parseUID(uid));
41 
42 }

?

美团UID生成器

Maven依赖

1 2     >org.apache.ignite3     >ignite-zookeeper4     >2.4.05  `id_segment`;
 `id_segment` (
 4   `biz_tag` varchar(50) DEFAULT 业务标识 5   `max_id` bigint(20) 分配的id号段的最大值 6   `p_step` 步长 7   `last_update_time` datetime NULL 8   `current_update_time` NULL
 9 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT号段存储表;
insert  into `id_segment`(`biz_tag`,`max_id`,`p_step`,`last_update_time`,`current_update_time`) values (Order60,1); font-weight: bold">20,2018-07-21 15:44:022018-07-21 16:25:07');

Spring Bean配置

 com.cjs.example.meituan.idleaf.support.MysqlIdLeafServiceImpl;
11 
13 15 
16     17         SpringApplication.run(UidGeneratorDemoApplication.19 
 JdbcTemplate jdbcTemplate;
22 
23     @Bean(initMethod = "init"24      IdLeafService idLeafService() {
25         MysqlIdLeafServiceImpl mysqlIdLeafService =  MysqlIdLeafServiceImpl();
        mysqlIdLeafService.setJdbcTemplate(jdbcTemplate);
27         mysqlIdLeafService.setAsynLoadingSegment(true28         mysqlIdLeafService.setBizTag("Order"29          mysqlIdLeafService;
31 }

测试

@Autowired
2  IdLeafService idLeafService;
3 
4 @Test
 testSerialGenerate3() {
6     Long id = idLeafService.getId();
7     System.out.println(id);
8 }

?

个人感觉无论是从文档,原理,还是代码,觉得还是百度的那个比较好用(哇咔咔O(∩_∩)O哈哈~)

还有一个Redis的方案感觉也不错

?完整代码上传至??https://github.com/chengjiansheng/uid-generator-demo.git

参考

https://github.com/baidu/uid-generator

https://tech.meituan.com/MT_Leaf.html?utm_source=tuicool&utm_medium=referral

https://github.com/zhuzhong/idleaf

?

https://blog.csdn.net/liubenlong007/article/details/53884447

https://www.cnblogs.com/baiwa/p/5318432.html

https://blog.csdn.net/imi00/article/details/78629710

?

最后,关于RingBuffer(循环缓冲区,或者叫 环形缓冲区)

https://blog.csdn.net/u011046042/article/details/51853535

https://www.jianshu.com/p/c3913c5cc184

https://blog.csdn.net/z69183787/article/details/52403134

?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读