当前位置: 首页 > wzjs >正文

澄迈住宅与建设局网站北京海淀区工商局网站

澄迈住宅与建设局网站,北京海淀区工商局网站,wordpress小工具目录,怎么做彩票游戏网站引言 分布式ID,所谓的分布式ID,就是针对整个系统而言,任何时刻获取一个ID,无论系统处于何种情况,该值不会与之前产生的值重复,之后获取分布式ID时,也不会再获取到与其相同的值,它是…

引言

分布式ID,所谓的分布式ID,就是针对整个系统而言,任何时刻获取一个ID,无论系统处于何种情况,该值不会与之前产生的值重复,之后获取分布式ID时,也不会再获取到与其相同的值,它是一个绝对意义上的全局唯一值。

那么,究竟什么情况下需要用到分布式ID呢?

最经典的场景是分库分表,还是以用户数据来举例子,之前只有一张用户表,所以设置表ID自增后,每新增一条数据都会自增ID值,从而确保了ID永远不会重复。
此刻用户表被分成了十张,如果再依靠数据库本身的自增机制来分配ID,显然会导致ID重复,这时分布式ID就派上了用场。除开分库分表外,通常还会用到分布式ID的场景有:

  • 链路ID:分布式链路中,需要通过全局唯一的traceId来串联所有日志;
  • 请求ID:幂等性处理时,需要通过唯一的ID来判断是否为重复请求;
  • 消息标识:MQ需要基于唯一的msgID来区分数据,确保数据不重复或丢失;
  • 短链码:生成短链接时,需要获取一个全局唯一的值作为Code避免重复;

下面将阐述怎么在项目中实践,为我们的对象生成一个分布式ID

UUID生成

String uuid = UUID.randomUUID().toString();
System.out.println(uuid);/*
* 输出结果:
*   b2c2ec5d-efb9-44c7-b2c8-9cef367c8b3f
* */

通过JDK提供的UUID工具类,一行代码就能生成一个UUID,并且得到的UUID不会重复,怎么保障的呢?UUID的底层,会基于硬件地址(MAC地址)、时间戳和随机因子来生成ID。
世界上没有两片完全相同的叶子,者如这句话一般,世界上也没有两台完全相同的机器,这时硬件地址自然不同,再加上正常情况下不可逆转的时间戳,以及一定范围的随机数,就能确保产生的UUID,其全球唯一性。

雪花算法

雪花算法生成的分布式ID,在Java中会使用Long类型来承载,Long类型占位8bytes,也就正好对应上述这张图的64个比特位,这64bit会被分为四部分:

  • 符号位(1bit):永远为零,表示生成的分布式ID为正数。
  • 时间戳位(2~42bit):会将当前系统的时间戳插入到这段位置。
  • 工作进程位(43~53bit):在集群环境下,每个进程唯一的工作ID
  • 序列号位(54~64bit):该序列是用来在同一个毫秒内生成不同的序列号。
/*
* 雪花算法实现类
* */
public class Snowflake implements Serializable {private static final long serialVersionUID = 1L;// 雪花算法的起始时间纪元public static long DEFAULT_TWEPOCH = 1288834974657L;public static long DEFAULT_TIME_OFFSET = 2000L;// 机器标识所占的位数private static final long WORKER_ID_BITS = 5L;// 数据中心标识所占的位数private static final long DATA_CENTER_ID_BITS = 5L;// 毫秒内的自增位数private static final long SEQUENCE_BITS = 12L;// 机器ID最大值private static final long MAX_WORKER_ID = 31L;// 数据中心ID最大值private static final long MAX_DATA_CENTER_ID = 31L;// 机器ID左移12位private static final long WORKER_ID_SHIFT = 12L;// 数据中心左移17位private static final long DATA_CENTER_ID_SHIFT = 17L;// 毫秒时间戳左移22位private static final long TIMESTAMP_LEFT_SHIFT = 22L;private static final long SEQUENCE_MASK = 4095L;// 雪花ID相关组成部分的定义private final long twepoch;private final long workerId;private final long dataCenterId;private final boolean useSystemClock;private final long timeOffset;private final long randomSequenceLimit;private long sequence;// 最近一次生产ID的时间戳private long lastTimestamp;public Snowflake() {this(IdUtil.getWorkerId(IdUtil.getDataCenterId(31L), 31L));}public Snowflake(long workerId) {this(workerId, IdUtil.getDataCenterId(31L));}public Snowflake(long workerId, long dataCenterId) {this(workerId, dataCenterId, false);}public Snowflake(long workerId, long dataCenterId, boolean isUseSystemClock) {this((Date)null, workerId, dataCenterId, isUseSystemClock);}public Snowflake(Date epochDate, long workerId, long dataCenterId, boolean isUseSystemClock) {this(epochDate, workerId, dataCenterId, isUseSystemClock, DEFAULT_TIME_OFFSET);}public Snowflake(Date epochDate, long workerId, long dataCenterId, boolean isUseSystemClock, long timeOffset) {this(epochDate, workerId, dataCenterId, isUseSystemClock, timeOffset, 0L);}public Snowflake(Date epochDate, long workerId, long dataCenterId, boolean isUseSystemClock, long timeOffset, long randomSequenceLimit) {this.sequence = 0L;this.lastTimestamp = -1L;this.twepoch = null != epochDate ? epochDate.getTime() : DEFAULT_TWEPOCH;this.workerId = Assert.checkBetween(workerId, 0L, 31L);this.dataCenterId = Assert.checkBetween(dataCenterId, 0L, 31L);this.useSystemClock = isUseSystemClock;this.timeOffset = timeOffset;this.randomSequenceLimit = Assert.checkBetween(randomSequenceLimit, 0L, 4095L);}public long getWorkerId(long id) {return id >> 12 & 31L;}public long getDataCenterId(long id) {return id >> 17 & 31L;}public long getGenerateDateTime(long id) {return (id >> 22 & 2199023255551L) + this.twepoch;}public synchronized long nextId() {long timestamp = this.genTime();// 解决时钟回拨问题if (timestamp < this.lastTimestamp) {if (this.lastTimestamp - timestamp >= this.timeOffset) {throw new IllegalStateException(StrUtil.format("Clock moved backwards. Refusing to generate id for {}ms", new Object[]{this.lastTimestamp - timestamp}));}timestamp = this.lastTimestamp;}if (timestamp == this.lastTimestamp) {long sequence = this.sequence + 1L & 4095L;if (sequence == 0L) {timestamp = this.tilNextMillis(this.lastTimestamp);}this.sequence = sequence;} else if (this.randomSequenceLimit > 1L) {this.sequence = RandomUtil.randomLong(this.randomSequenceLimit);} else {this.sequence = 0L;}this.lastTimestamp = timestamp;return timestamp - this.twepoch << 22 | this.dataCenterId << 17 | this.workerId << 12 | this.sequence;}public String nextIdStr() {return Long.toString(this.nextId());}private long tilNextMillis(long lastTimestamp) {long timestamp;for(timestamp = this.genTime(); timestamp == lastTimestamp; timestamp = this.genTime()) {}if (timestamp < lastTimestamp) {throw new IllegalStateException(StrUtil.format("Clock moved backwards. Refusing to generate id for {}ms", new Object[]{lastTimestamp - timestamp}));} else {return timestamp;}}private long genTime() {return this.useSystemClock ? SystemClock.now() : System.currentTimeMillis();}
}

上面代码可以直接引用来作为我们的雪花算法工具类

由于原始版雪花算法存在的问题,出现了许多改良版算法,但其核心还是前面聊到的雪花算法,比如百度的Uid-Generator算法、美团的Leaf算法-雪花模式、阿里的Seata框架里的雪花算法实现等等,感兴趣的小伙伴可以自行翻阅源码。

以上就是最常用的实践方式欢迎大家补充


文章转载自:

http://Ebq9c3YA.gkdhf.cn
http://g3KR0hJJ.gkdhf.cn
http://uenJLih4.gkdhf.cn
http://3HDAEmQg.gkdhf.cn
http://rMiMM6k8.gkdhf.cn
http://rPzK17bH.gkdhf.cn
http://LAleSsN6.gkdhf.cn
http://EpH80jgu.gkdhf.cn
http://jEsKO869.gkdhf.cn
http://uaj8kr4m.gkdhf.cn
http://tAPsnMMG.gkdhf.cn
http://FFUoXWD1.gkdhf.cn
http://ADCRXnPh.gkdhf.cn
http://ZkwoxOMW.gkdhf.cn
http://3B71rKvc.gkdhf.cn
http://Y68pSkHw.gkdhf.cn
http://mkiu9zCO.gkdhf.cn
http://RWIj1LVS.gkdhf.cn
http://vCRhCVNj.gkdhf.cn
http://b8sqjcga.gkdhf.cn
http://6oOuArS5.gkdhf.cn
http://Nck1CrjT.gkdhf.cn
http://VwBI3Nht.gkdhf.cn
http://vEkWahCO.gkdhf.cn
http://ywxjWV39.gkdhf.cn
http://vbAazXby.gkdhf.cn
http://VxLAkfea.gkdhf.cn
http://YFX7gA4b.gkdhf.cn
http://gB3WWgiP.gkdhf.cn
http://sgi39WmV.gkdhf.cn
http://www.dtcms.com/wzjs/740277.html

相关文章:

  • 东莞网站平台费用自己创建网站的注意事项
  • 中英网站怎么做做百度网站每年的费用多少
  • 如何建设html网站办公室装修案例
  • 企业州建设银行网站汕头建站培训
  • 官方网站查询 优帮云百度在线识别图片
  • 长丰下塘新农村建设网站竞价排名软件
  • 织梦网站如何做二级导航做网站需要学些什么条件
  • 杭州滨江建行网站wordpress读取新闻
  • 衡水网站建设哪家专业旅游网站开发参考文献
  • 购物网站静态页面模板建设网站那里好
  • 用dw做网站的视频最新仿uehtml网站源码
  • 平台网站建设报价wordpress 菜单 颜色
  • 温州网站建设及推广怎么查房产信息查询
  • 自己建的网站百度查找不到想做一个自己设计公司的网站怎么做
  • 怎样快速学好网站建设一级做a免费体验区不用下载网站
  • django做待办事项网站如何确认wordpress使用什么主题
  • 国外品牌网站深圳优化公司公认安高粱seo
  • html5网站在线制作建立网站团队
  • 建网站如何安装wordpress主题
  • 网站没有经过我司审核通过白名单长沙公司排行榜
  • 家具网站建设需求网站建设清单
  • 网站建设手机源码雅江网站建设
  • 网站怎么加友情链接网站空间服务器续费
  • 织梦手机网站有广告黄冈网站推广在线
  • 网上装修公司网站策划书商标设计网站免费
  • 宁津做网站seo站内优化技巧
  • 小说网站推荐网站建设规划过程和
  • 福安市教育局建设网站怎么做链接
  • 建设c2c网站需要多少投资问答社区网站建设
  • 教你如何建设网站阿里去wordpress前台登陆验证码