雪花算法生成的id总共64位8个字节,结构如下:

符号位 时间位 工作机器标识位 序列位
1位(固定位0) 41位 10位 12位

worker.id

sharding jdbc  4.1.1使用雪花算法生成分布式id时,会使用到属性work.id表示机器标识位,取值范围[0,1024),配置示例如下:

sharding: tables: user: actual-data-nodes: ds$->{0..1}.user_$->{1..3}key-generator: column: idtype: SNOWFLAKEprops:worker.id: 100max.vibration.offset: 2database-strategy:inline:sharding-column: idalgorithm-expression: ds$->{id%2}table-strategy: inline:sharding-column: idalgorithm-expression: user_$->{id%3+1}  

如果希望动态指定work.id属性,可以通过调用System.setProperty()的方式实现,示例如下:

package com.zhut.sharding.config;import org.springframework.context.annotation.Configuration;@Configuration
public class Config {static {System.setProperty("workerId", String.valueOf(100));}
}

这里只是个例子,具体的值可以通过ip或者hostname经过一定的运算后得到。

修改配置文件,改成这样 worker.id: ${workerId}

max.vibration.offset

标准的雪花算法,在生成id时,如果本次生成id的时间与上一次生成id的时间不是同一毫秒,即跨了毫秒,则序列部分会从0开始计算。如果不是高并发环境下,每次生成id都可能跨毫秒,这样每次生成的id都是偶数,如果根据id进行奇偶分片,则数据全部落到偶数表里面了,这种结果肯定不是我们期望的。

我们期望的结果是,数据能均匀的分布到奇偶表中,那么跨毫秒生成的id的序列就不能一直从0开始。max.vibration.offset就能解决这个问题,先看看源码(SnowflakeShardingKeyGenerator,在eclipse中可以使用Ctrl+T进行搜索):

    private int sequenceOffset = -1;@Overridepublic synchronized Comparable<?> generateKey() {long currentMilliseconds = timeService.getCurrentMillis();if (waitTolerateTimeDifferenceIfNeed(currentMilliseconds)) {currentMilliseconds = timeService.getCurrentMillis();}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) | (getWorkerId() << WORKER_ID_LEFT_SHIFT_BITS) | sequence;}private int getMaxVibrationOffset() {int result = Integer.parseInt(properties.getProperty("max.vibration.offset", String.valueOf(DEFAULT_VIBRATION_VALUE)));Preconditions.checkArgument(result >= 0 && result <= SEQUENCE_MASK, "Illegal max vibration offset");return result;}private void vibrateSequenceOffset() {sequenceOffset = sequenceOffset >= getMaxVibrationOffset() ? 0 : sequenceOffset + 1;}

生成key时,如果跨毫秒了,则会执行vibrateSequenceOffset方法,该方法会读取max.vibration.offset的值,如果sequenceOffset大于或等于该值,则序列从0开始,否则序列每次在上次一次的基础上加1。则样就保证了奇偶均匀分布了。

如果max.vibration.offset配置为1,则每次的序列都按照0,1这个顺序反复取,如果配置位2,就按照0,1,2反复取。

sharding jdbc 的雪花算法中的属性worker.id和max.vibration.offset相关推荐

  1. 雪花算法中的时间回拨问题解决方案

    什么是时间回拨问题 雪花算法通过时间来即将作为id的区分标准之一,对于同一台id生成机器,它通过时间和序号保证id不重复 当机器出现问题,时间可能回到之前,此时,时间就不能区分 又或者因为闰秒的出现, ...

  2. python雪花算法生成id_理解分布式id生成算法SnowFlake

    分布式id生成算法的有很多种,Twitter的SnowFlake就是其中经典的一种. 概述 SnowFlake算法生成id的结果是一个64bit大小的整数,它的结构如下图: 1位,不用.二进制中最高位 ...

  3. 雪花算法及运用PHP,雪花算法生成全局唯一ID,参考了下网上雪花算法生成规则,机器ID和序列号自动获取 理论上毫秒可生成 1024*4096个唯一ID

    任务要求毫秒生成10000个唯一ID 研究了下twitter/snowflake的算法思想: 参考了下网上雪花算法生成规则,把数据中心和机器编号整合一起,变成10位机器ID, 机器ID和序列号自动获取 ...

  4. html中item属性,项目id(属性) | itemid (attribute)

    项目id(属性) | itemid (attribute) itemid全局属性是某个项目的唯一全局标识符.itemid属性只能为既具有元素指定itemscope和itemtype属性.此外,item ...

  5. 后端发送给前端雪花算法生成的Long类型Id 前端接收Id与发送的Id不匹配

    问题描述:后端传Long类型给前端, Long类型数据大于17位时.前端拿到的数据出现精度丢失. 问题原因:后端传的Long类型Id是64位整数,在js中number类型的安全整数是53位,如果超过5 ...

  6. Sharding JDBC分片和读写分离详解

    目录 Sharding Sphere简介 开始使用Sharding JDBC 数据分片 简单示例 Spring Boot示例 代码分析 属性分析 绑定表和广播表 真实表 绑定表 广播表 Shardin ...

  7. mybatis-plus雪花算法生成Id使用详解

    文章目录 前言 一.mybatis-plus官网 二.雪花算法实战 1.建表 2.新建测试工程 3.单元测试 三.实现分析 四.为什么默认就是雪花算法 五.主动设置Id生成策略 六.内置的雪花算法工具 ...

  8. 关于雪花算法id冲突的思考解决思路

    1.背景: 公司的分布式应用部署了多个pod,  利用雪花算法来生成id, 然后用来保存数据, 但是生产上跑久了之后,偶尔间就会出现id碰撞的事情, 出现的概率非常小,但是一出现就会导致该笔业务处理失 ...

  9. SnowflakeId - 雪花算法

    组成结构   雪花算法生成的ID是纯数字且具有时间顺序的.其原始版本是scala版,后面出现了许多其他语言的版本如Java.C++等. 1bit位标识,由于long基本类型在Java中是带符号的,最高 ...

最新文章

  1. 这个能快速发表Cell,Nature,Molecular cell的分析技术你要错过吗?
  2. charshow技术预研
  3. 递归第一弹:初步理解
  4. Virtualization基础
  5. 仿真模拟,需要注意这几点!
  6. SharePoint 2013异常信息的查看
  7. Download Microsoft Visual Studio 2010 Ultimate Trial - ISO from Official Microsoft Download Center
  8. matlab 一阶惯性环节,一阶惯性环节
  9. js图片url反转file文件
  10. redis 默认过期策略_redis 过期策略
  11. mysql2008安装失败_SQL Server 2008 安装失败问题总结
  12. 综合分析:市面上的nmn哪个牌子比较好?美国产nmn哪个牌子好?
  13. android车载系统测试,【图】原生安卓来了!Polestar 2智能车联测试_汽车之家
  14. 两点顶点之间最短路径问题
  15. 此前小编为大家介绍了女人吃鸡蛋的好处,想必大家对鸡蛋这种蛋类有了更多的了解。今天小编为大家介绍另一种蛋类——鸭蛋。鸭蛋又名鸭卵,是人们经常食用的一种蛋类食品,与鸡蛋营养相当,吃它的好处众多。那么女人吃
  16. 用python一键去除图片、PDF水印
  17. 二战漫画爬虫(爱漫画网)
  18. Look N Stop防火墙使用指南规则教程(1)
  19. 《百钱买百鸡》c语言(循环结构)
  20. 坚果云+svn实现异地非局域网个人代码版本管理

热门文章

  1. 【python安全攻防】python简易端口扫描器
  2. 如何用人工智能高效选研究题目?
  3. BigDecimal 正数转换成负数
  4. ROS2 Dashing源码编译和安装
  5. PLSQL连接 ORACLE11g详解
  6. JeecgBoot低代码平台 3.5.2,仪表盘版本发布!重磅新功能—支持在线拖拽设计大屏和门户
  7. android go预览版下载地址,Android 11 Go正式版-Android 11 Go安卓正式版预约 v1.0.0-友情手机站...
  8. 推荐在线编程学习网站
  9. 赛车游戏中求解最短路径和最小曲率路径
  10. summernote富文本中上传图片并保存到Oracle数据库的问题解决