springboot项目创建全局唯一id生成方法,参考 Snowflake算法

yml文件

#app 全局唯一id生成
app:idGenerator:workerId: 1datacenterId: 0
IdGenerator文件:
package smartt.styy.auth.util;import javax.annotation.PostConstruct;import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;@Component
public class IdGenerator {@Value("${app.idGenerator.workerId}")private long workerId;@Value("${app.idGenerator.datacenterId}")private long datacenterId;private long sequence = 0L;private long twepoch = 1288834974657L;private long workerIdBits = 8L;private long datacenterIdBits = 2L;private long maxWorkerId = -1L ^ (-1L << workerIdBits);private long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);private long sequenceBits = 12L;private long workerIdShift = sequenceBits;private long datacenterIdShift = sequenceBits + workerIdBits;private long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;private long sequenceMask = -1L ^ (-1L << sequenceBits);private long lastTimestamp = -1L;/** workerId是机器ID,datacenterId是数据中心ID或机房ID。* 这都是为分布式而设置的,workerId每台机器肯定不一样,最大值由maxWorkerId限制。*/public IdGenerator() {// 可以在命令行中添加参数覆盖application.yaml中的配置// 比如--app.idGenerator.workerId=1 --app.idGenerator.datacenterId=0}@PostConstructpublic void init() {if (workerId > maxWorkerId || workerId < 0) {throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));}if (datacenterId > maxDatacenterId || datacenterId < 0) {throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));}System.out.println(String.format("worker starting. timestamp left shift %d, datacenter id bits %d, worker id bits %d, sequence bits %d, workerid %d",timestampLeftShift, datacenterIdBits, workerIdBits, sequenceBits, workerId));}public synchronized String nextId() {long timestamp = timeGen();if (timestamp < lastTimestamp) {long delay = lastTimestamp - timestamp;System.out.println("等待时间追平" + delay);try {Thread.sleep(delay + 1);} catch (InterruptedException e) {e.printStackTrace();}timestamp = timeGen();}if (lastTimestamp == timestamp) {sequence = (sequence + 1) & sequenceMask;if (sequence == 0) {timestamp = tilNextMillis(lastTimestamp);}} else {sequence = 0L;}lastTimestamp = timestamp;return "N" + (((timestamp - twepoch) << timestampLeftShift) | (datacenterId << datacenterIdShift)| (workerId << workerIdShift) | sequence);}protected long tilNextMillis(long lastTimestamp) {long timestamp = timeGen();while (timestamp <= lastTimestamp) {timestamp = timeGen();}return timestamp;}protected long timeGen() {return System.currentTimeMillis();}}

使用的时候直接

@Autowired
private IdGenerator idGenerator;

idGenerator.nextId()

springboot项目创建全局唯一id生成器相关推荐

  1. SpringBoot集成百度uid-generator唯一ID生成器

    大家好,我是猿人(猿码天地创始人),今天给码农们或即将成为码农或想成为码农的朋友讲讲SpringBoot集成百度uid-generator唯一ID生成器,现在是深夜23:10分,猿人最擅长熬夜,就是不 ...

  2. Spring Boot 工程集成全局唯一ID生成器 Vesta

    2019独角兽企业重金招聘Python工程师标准>>> 本文内容脑图如下: 文章共 760字,阅读大约需要 2分钟 ! 概 述 在前一篇文章 <Spring Boot工程集成全 ...

  3. 基于百度的UidGenerator改造的全局唯一id生成器

    其实百度的UidGenerator生成器也是基于snowflake算法的,在原生的项目中使用的基于数据库的,我改造成了基于zookpeer的,用zookpeer的序列号实现分布式seq的生成(代替了算 ...

  4. 分布式全局唯一 ID生成器(百度UidGenerator)

    文章目录 为什么要使用全局ID生成器? 使用UUID作为主键? 使用数据库主键自增? UidGenerator简介 雪花算法snowflake SpringBoot整合百度UidGenerator 为 ...

  5. 全局唯一id生成器----Vesta

    引入依赖: <dependency><groupId>com.robert.vesta</groupId><artifactId>vesta-servi ...

  6. springboot持续集成百度唯一id生成器(UidGenerator)

    springboot集成UidGenerator 集成UidGenerator 第一步:拉去开源项目,打成jar包 第二步:导包 第三步:创建数据库表结构 第四步:配置数据库信息以及mapper扫描 ...

  7. 【Redis】解决全局唯一 id 问题

    永远要记得坚持的意义 一.全局唯一 id 场景 概念: 以订单表的 id 为例 使用自增 id 会产生的问题: id 的规律性太明显,容易让用户猜测到一些信息 受表单数据量的限制 -- 分布式存储时, ...

  8. 唯一ID生成器snowflake

    分布式全局唯一ID生成器 很多场景需要使用全局唯一ID,用来标识唯一一条消息,唯一一笔交易,唯一一个用户,唯一一张图片等等. 传统数据库表的自增主键是很简单的一种实现方式,前提是你没有分库,也没有分表 ...

  9. Redis生成全局唯一ID

    简介: 全局唯一ID生成器是一种在分布式系统下用来生成全局唯一ID的工具 特性: 唯一性 高性能 安全性 高可用 递增性 生成规则: 有时为了增加ID的安全性,我们可以不直接使用Redis自增的数值, ...

最新文章

  1. linux df是否分区,Linux中df命令查询磁盘信息和fdisk命令分区的用法
  2. React源码分析与实现(一):组件的初始化与渲染
  3. layui关闭表格编辑_Layui表格table关闭拖拽列宽、禁用拖拽列宽
  4. 简述sqlite数据库的特点_SQLite
  5. Git学习笔记05--git stash
  6. 解析:Python为什么这么流行?
  7. 打开高效文本编辑之门_Linux Awk之条件判断与循环
  8. 蓝奏云文件上传php源码_蓝奏云客户端 v0.3.1,第三方蓝奏网盘电脑版
  9. [css] border-radius:50%和border-radius:100%有什么区别?
  10. 467python教程_Magnus Lie Hetland的《Python基础教程(第3版)》自学笔记(持续更新中)...
  11. opencv配置中常见问题
  12. CTF加密题型解析:RSA算法的CTF解法之一
  13. linux虚拟机镜像下载
  14. goeasy+jquery+ckplayer实现动态实时视频弹幕
  15. 神舟测试软件,神舟战神P5常规性能软件测试_神舟 战神P5-i78172D1_笔记本评测-中关村在线...
  16. ubuntu中安装pdf虚拟打印机
  17. 快商通智能客服云平台、金融反欺诈方案获中科院互联网周刊金i奖
  18. 逻辑漏洞之任意密码重置
  19. 科研入门必备知识之论文种类--Journal、magazine、transactions、proceedings
  20. 计算机网络的分类 ppt,计算机网络的分类.ppt

热门文章

  1. TinyJPEG源码剖析
  2. mysql rrdtool,rrdtool mysql 在运维平台中的应用
  3. 海外众筹项目怎么发起创建?
  4. win10用管理员模式打开CMD
  5. 男人品位分类及终极品位
  6. 有一种选择叫女程(1)
  7. window下添加nginx环境变量
  8. python 协程安全理解
  9. ffmpeg rtmp 花屏_FFmpeg代码架构
  10. 身份证号尾数计算器 – 附在线版链接