JAVA实现雪花算法生成唯一订单号工具类的方法
发表于:2024-11-15 作者:千家信息网编辑
千家信息网最后更新 2024年11月15日,这篇文章主要讲解了"JAVA实现雪花算法生成唯一订单号工具类的方法",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"JAVA实现雪花算法生成唯一订单号工具
千家信息网最后更新 2024年11月15日JAVA实现雪花算法生成唯一订单号工具类的方法
这篇文章主要讲解了"JAVA实现雪花算法生成唯一订单号工具类的方法",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"JAVA实现雪花算法生成唯一订单号工具类的方法"吧!
import lombok.SneakyThrows;import lombok.extern.slf4j.Slf4j;import java.util.Calendar;/** * Default distributed primary key generator. * ** Use snowflake algorithm. Length is 64 bit. *
* ** 1bit sign bit. * 41bits timestamp offset from 2016.11.01(ShardingSphere distributed primary key published data) to now. * 10bits worker process id. * 12bits auto increment offset in one mills ** ** Call @{@code DefaultKeyGenerator.setWorkerId} to set worker id, default value is 0. *
* ** Call @{@code DefaultKeyGenerator.setMaxTolerateTimeDifferenceMilliseconds} to set max tolerate time difference milliseconds, default value is 0. *
* * @author gaohongtao */@Slf4jpublic final class SnowflakeKeyGenerator { public static final long EPOCH; private static final long SEQUENCE_BITS = 12L; private static final long WORKER_ID_BITS = 10L; private static final long SEQUENCE_MASK = (1 << SEQUENCE_BITS) - 1; private static final long WORKER_ID_LEFT_SHIFT_BITS = SEQUENCE_BITS; private static final long TIMESTAMP_LEFT_SHIFT_BITS = WORKER_ID_LEFT_SHIFT_BITS + WORKER_ID_BITS; private static final long WORKER_ID_MAX_VALUE = 1L << WORKER_ID_BITS; private static long workerId; private static int maxTolerateTimeDifferenceMilliseconds = 10; static { Calendar calendar = Calendar.getInstance(); calendar.set(2016, Calendar.NOVEMBER, 1); calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); EPOCH = calendar.getTimeInMillis(); } private byte sequenceOffset; private long sequence; private long lastMilliseconds; /** * Set work process id. * * @param workerId work process id */ public static void setWorkerId(final long workerId) { if (workerId < 0L || workerId >= WORKER_ID_MAX_VALUE) { throw new IllegalArgumentException(); } SnowflakeKeyGenerator.workerId = workerId; } /** * Set max tolerate time difference milliseconds. * * @param maxTolerateTimeDifferenceMilliseconds max tolerate time difference milliseconds */ public static void setMaxTolerateTimeDifferenceMilliseconds(final int maxTolerateTimeDifferenceMilliseconds) { SnowflakeKeyGenerator.maxTolerateTimeDifferenceMilliseconds = maxTolerateTimeDifferenceMilliseconds; } /** * Generate key. * * @return key type is @{@link Long}. */ public synchronized Long generateKey() { long currentMilliseconds = System.currentTimeMillis(); if (waitTolerateTimeDifferenceIfNeed(currentMilliseconds)) { currentMilliseconds = System.currentTimeMillis(); } if (lastMilliseconds == currentMilliseconds) { if (0L == (sequence = (sequence + 1) & SEQUENCE_MASK)) { currentMilliseconds = waitUntilNextTime(currentMilliseconds); } } else { vibrateSequenceOffset(); sequence = sequenceOffset; } lastMilliseconds = currentMilliseconds; return ((currentMilliseconds - EPOCH) << TIMESTAMP_LEFT_SHIFT_BITS) | (workerId << WORKER_ID_LEFT_SHIFT_BITS) | sequence; } @SneakyThrows private boolean waitTolerateTimeDifferenceIfNeed(final long currentMilliseconds) { if (lastMilliseconds <= currentMilliseconds) { return false; } long timeDifferenceMilliseconds = lastMilliseconds - currentMilliseconds; if (timeDifferenceMilliseconds >= maxTolerateTimeDifferenceMilliseconds) { log.error(String.format("Clock is moving backwards, last time is %d milliseconds, current time is %d milliseconds", lastMilliseconds, currentMilliseconds)); //throw new IllegalStateException(String.format("Clock is moving backwards, last time is %d milliseconds, current time is %d milliseconds", lastMilliseconds, currentMilliseconds)); } Thread.sleep(timeDifferenceMilliseconds); return true; } private long waitUntilNextTime(final long lastTime) { long result = System.currentTimeMillis(); while (result <= lastTime) { result = System.currentTimeMillis(); } return result; } private void vibrateSequenceOffset() { sequenceOffset = (byte) (~sequenceOffset & 1); }}
spring boot配置文件:
keyGenerator: snowflake: workerId: 20 #进程ID,每个实例都要设置不同的值,范围:0-1023 maxTolerateTime: 1500 #最大容忍时钟回退时间,单位:毫秒
如果mybati使用了plugins插件,可以继承进来
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;import org.mybatis.spring.annotation.MapperScan;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.transaction.annotation.EnableTransactionManagement;@EnableTransactionManagement@Configuration@MapperScan({"com.csair.module.*.mybatis.mapper"})public class MybatisPlusConfiguration { @Bean public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); } @Bean public SnowflakeKeyGenerator getSnowflakeKeyGenerator(@Value("${keyGenerator.snowflake.workerId}")Integer workerId, @Value("${keyGenerator.snowflake.maxTolerateTime}")Integer maxTolerateTime){ SnowflakeKeyGenerator.setWorkerId(workerId); SnowflakeKeyGenerator.setMaxTolerateTimeDifferenceMilliseconds(maxTolerateTime); return new SnowflakeKeyGenerator(); }}
感谢各位的阅读,以上就是"JAVA实现雪花算法生成唯一订单号工具类的方法"的内容了,经过本文的学习后,相信大家对JAVA实现雪花算法生成唯一订单号工具类的方法这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
工具
方法
算法
订单
订单号
雪花
生成
学习
内容
不同
最大
单位
实例
就是
思路
情况
插件
文件
文章
时钟
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
软件开发犯罪案例
重庆vr软件开发公司有哪些
网络技术竞赛团队口号
网络安全泄露的危害
如何上传文件到远程服务器
服务器的机器码
做嵌入式软件开发才毕业工资
网络安全教育 国旗下的讲话
工作日报服务器软件
天龙八部进服务器还要排队
上海软件开发涉密信息系统集成
戴尔r740服务器风扇不转
宿迁多维互联网络科技有限公司
结构型软件开发模型
数据库导出后是什么样子
海康存储服务器添加硬盘
超融合服务器交换机配置pvid
服务器安全狗v3.3
t300 服务器 二手
网络安全观影心得
青岛公安网络安全
实时数据库odbc驱动
阿里服务器安全
盾钰(上海)互联网科技有限
网络技术工程师多少一个月
网络安全产品入侵检测系统
数据库salt
网络技术实验报告配置和测试网络
jira支持的数据库排序规则
通过数据库如何找回后台用户名