一句该文章做的笔记:https://blog.csdn.net/a13794479495/article/details/83541569

1.下载源码https://github.com/baidu/uid-generator,并依据官网创建好表

修改数据库连接池

<!--<dependency>
     <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.19</version>
            <scope>test</scope>
        </dependency>-->
        <!--更换数据库连接池为HikariCP-->
        <dependency>
            <groupId>com.zaxxer</groupId>
            <artifactId>HikariCP</artifactId>
            <version>2.7.9</version>
        </dependency>

修改数据库连接池参数信息

	<!-- 数据源配置 -->
	<bean id="dataSource"  class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
		<property name="driverClassName" value="${mysql.driver}" />
		<property name="connectionTestQuery" value="select 1" />
		<property name="jdbcUrl" value="${jdbc.url}" />
		<property name="username" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
		<property name="readOnly" value="false" />
		<property name="connectionTimeout" value="30000" />
		<property name="idleTimeout" value="600000" />
		<property name="maxLifetime" value="1800000" />
		<property name="maximumPoolSize" value="15" />
		<!--
		dataSource.setMaximumPoolSize(15);-->
	</bean>
mysql.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://192.168.xx.xx:3306/test?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
jdbc.username=root
jdbc.password=/Akk2pyqQ8ohJN8tOmGwdPr64BNxG/hnjXZqZrp2d7X8BNk1:

执行mvn clean install

 

2.springboot工程集成

正常ssm工程

引入依赖

<dependency>
	<groupId>com.baidu.fsg</groupId>
	<artifactId>uid-generator</artifactId>
	<version>1.0.0-SNAPSHOT</version>
</dependency>

mybatis配置信息

mybatis:
  config-location: classpath:mybatis/mybatis-config.xml
  mapper-locations:
  - classpath*:mybatis/mapper/*Mapper.xml

拷贝WorkerNodeDAO.java到自己的springboot项目中,命名成WorkerNodeMapper.java

 

 

拷贝WORKER_NODE.xml到自己的springboot项目中,命名成WorkerNodeMapper.xml

 

 

拷贝DisposableWorkerIdAssigner.java到自己的springboot项目中,修改注入的WorkerNodeDAO为WorkerNodeMapper;

 

 

创建配置类

package com.share.config;

import com.baidu.fsg.uid.impl.CachedUidGenerator;
import com.share.service.DisposableWorkerIdAssigner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * https://github.com/baidu/uid-generator/blob/master/README.zh_cn.md
 * 百度id生成器
 * 两种生成器: DefaultUidGenerator、CachedUidGenerator。如对UID生成性能有要求, 请使用CachedUidGenerator
 * 对应Spring配置分别为: default-uid-spring.xml、cached-uid-spring.xml
 */
@Configuration
public class CachedUidGeneratorConfig {

    /**
     * 用完即弃的WorkerIdAssigner, 依赖DB操作
     * @return
     */
    @Bean
    public DisposableWorkerIdAssigner disposableWorkerIdAssigner(){
        return new DisposableWorkerIdAssigner();
    }

    @Bean
    public CachedUidGenerator cachedUidGenerator(DisposableWorkerIdAssigner disposableWorkerIdAssigner){
        CachedUidGenerator cachedUidGenerator = new CachedUidGenerator();
        cachedUidGenerator.setWorkerIdAssigner(disposableWorkerIdAssigner);
        //以下为可选配置, 如未指定将采用默认值
        cachedUidGenerator.setTimeBits(29);
        cachedUidGenerator.setWorkerBits(21);
        cachedUidGenerator.setSeqBits(13);
        cachedUidGenerator.setEpochStr("2016-09-20");

        //RingBuffer size扩容参数, 可提高UID生成的吞吐量
        //默认:3, 原bufferSize=8192, 扩容后bufferSize= 8192 << 3 = 65536
        cachedUidGenerator.setBoostPower(3);
        // 指定何时向RingBuffer中填充UID, 取值为百分比(0, 100), 默认为50
        // 举例: bufferSize=1024, paddingFactor=50 -> threshold=1024 * 50 / 100 = 512.
        // 当环上可用UID数量 < 512时, 将自动对RingBuffer进行填充补全
        //<property name="paddingFactor" value="50"></property>

        //另外一种RingBuffer填充时机, 在Schedule线程中, 周期性检查填充
        //默认:不配置此项, 即不实用Schedule线程. 如需使用, 请指定Schedule线程时间间隔, 单位:秒
        cachedUidGenerator.setScheduleInterval(60L);



        //拒绝策略: 当环已满, 无法继续填充时
        //默认无需指定, 将丢弃Put操作, 仅日志记录. 如有特殊需求, 请实现RejectedPutBufferHandler接口(支持Lambda表达式)
        //<property name="rejectedPutBufferHandler" ref="XxxxYourPutRejectPolicy"></property>
        //cachedUidGenerator.setRejectedPutBufferHandler();
        //拒绝策略: 当环已空, 无法继续获取时 -->
        //默认无需指定, 将记录日志, 并抛出UidGenerateException异常. 如有特殊需求, 请实现RejectedTakeBufferHandler接口(支持Lambda表达式) -->
        //<property name="rejectedTakeBufferHandler" ref="XxxxYourTakeRejectPolicy"></property>

        return cachedUidGenerator;
    }

}

controller测试

@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {

    @Autowired
    private UserService userService;

    @Autowired
    private UidGenerator uidGenerator;

    @GetMapping("/uid")
    public String uid(){
        long time1 = System.nanoTime();
        long uid = uidGenerator.getUID();
        long time2 = System.nanoTime();
        System.out.println(time2-time1);
        System.out.println(uidGenerator.parseUID(uid));
        System.out.println("-----------------------------");
        long timeMillis = System.currentTimeMillis();
        for (int i = 0; i < 10000000 ; i++) {
            uidGenerator.getUID();
        }
        long timeMillis2 = System.currentTimeMillis();
        System.out.println("耗时:"+(timeMillis2-timeMillis));
        return String.valueOf(uid);
    }
	....
}

启动工程,访问:http://localhost:5001/user/uid

控制台打印(本地生成10000000条id耗时913ms)

 

 

每次启动项目work_node表都会有一条日志

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐