Java生成全局唯一ID代码演示
看了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 ? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |