掌握MySQL分库分表(六)解决主键重复问题--Snowflake雪花算法
文章目录
- 问题及需求
- 常用ID解决方案
- 数据库自增ID
- UUID
- Redis发号器
- Snowflake雪花算法
- 分布式 ID 生成算法Snowflake原理
- 关于bit与byte
- 雪花算法的位数
- Snowflake必须注意的地方
- 全局唯⼀、不能重复
- 保证各个系统时间一致
- Snowflake雪花算法实现
- 雪花算法测试结果
问题及需求
单库下⼀般使用Mysql自增ID,但是分库分表后,会造成不同分片上的数据表主键会重复
需求:性能强劲、全局唯一、防止恶意用户规矩id的规则来获取数据
常用ID解决方案
数据库自增ID
利用自增id, 设置不同的⾃增步长:auto_increment_offset、auto-increment-increment
DB1: 单数
//从1开始、每次加2
DB2: 偶数
//从2开始,每次加2
缺点:
- 依靠数据库系统的功能实现,但是未来扩容麻烦
- 主从切换时的不⼀致可能会导致重复发号
- 性能瓶颈存在单台sql上
UUID
性能非常高,没有网络消耗
缺点:
- 无序的字符串,不具备趋势自增特性
- UUID太长,不易于存储,浪费存储空间,很多场景不适用
Redis发号器
利用Redis的INCR和INCRBY来实现,原子操作,线程安全,性能比Mysql强劲
缺点:
- 需要占用网络资源,增加系统复杂度
Snowflake雪花算法
- twitter 开源的分布式 ID生成算法,代码实现简单、不占用宽带、数据迁移不受影响
- 生成的 id 中包含有时间戳,所以生成的 id按照时间递增
- 部署了多台服务器,需要保证系统时间⼀样,机器编号不⼀样
缺点:
- 依赖系统时钟(多台服务器时间⼀定要⼀样)
分布式 ID 生成算法Snowflake原理
关于bit与byte
bit(位):电脑中存储的最小单位,可以存储⼆进制中的0或1
byte(字节):⼀个byte由8个bit组成
常规64位系统⾥⾯java数据类型存储字节大小
int:4 个字节
short:2 个字节
long:8 个字节
byte:1 个字节
float:4 个字节
double:8 个字节
char:2 个字节
科普:数据类型在不同位数机器的平台下长度不同
16位平台 int 2个字节16位
32位平台 int 4个字节32位
64位平台 int 4个字节32位
雪花算法的位数
雪花算法生成的数字,long类,所以是:8个byte,64bit
表示的值 -9223372036854775808(-2的63次方)~9223372036854775807(2的63次⽅-1)
生成的唯⼀值⽤于数据库主键,不能是负数,所以值为0~9223372036854775807(2的63次方-1)
- 第一个bit位代表符号位,正数是0,负数是1,ID为正数,所以固定为0
- 毫秒级时间戳部分占41bit,不是存储当前时间的时间截,服务上线的时间毫秒级的时间戳(为当前时间-服务第一次上线时间)
- 工作机器 id占10bit,可支持210 =1024个节点
- 序列号部分占12bit,可允许同一毫秒生成212 =4096个Id,则理论上一秒就可生成4096*1000 = 400万个ld
- 组合起来刚好是64位,Long类型
Snowflake必须注意的地方
全局唯⼀、不能重复
分布式部署就需要分配不同的workId, 如果workId相同,
可能会导致⽣成的id相同
保证各个系统时间一致
分布式情况下,需要保证各个系统时间⼀致,如果服务器的时钟回拨,就会导致⽣成的 id 重复
什么时候会系统回拨?
- 人工去生产环境做了系统时间调整
- 业务需求,代码里面做了系统时间同步
Snowflake雪花算法实现
配置文件
增加:
#配置workId
spring.shardingsphere.sharding.tables.product_order.key-generator.props.worker.id=1
方式一:订单id使用MybatisPlus的配置,ProductOrder类配置
@TableId(value = "id", type = IdType.ASSIGN_ID)
默认实现类为DefaultIdentifierGenerator雪花算法
方式二:使用Sharding-Jdbc配置文件,注释DO类里面的id分配策略
#id⽣成策略
spring.shardingsphere.sharding.tables.product_order.key-generator.column=id
spring.shardingsphere.sharding.tables.product_order.key-generator.type=SNOWFLAKE
方式三 进阶:动态指定sharding jdbc 的雪花算法中的属性work.id属性
使用sharding-jdbc中的使用IP后几位来做workId,但在某些情况下会出现生成重复ID的情况
解决办法: 在启动时给每个服务分配不同的workId, 引⼊redis/zk都行,缺点就是多了依赖
雪花算法测试结果


可以看出id全局不重复,并呈现出递增增长
相关文章:
掌握MySQL分库分表(六)解决主键重复问题--Snowflake雪花算法
文章目录问题及需求常用ID解决方案数据库自增IDUUIDRedis发号器Snowflake雪花算法分布式 ID 生成算法Snowflake原理关于bit与byte雪花算法的位数Snowflake必须注意的地方全局唯⼀、不能重复保证各个系统时间一致Snowflake雪花算法实现雪花算法测试结果问题及需求 单库下⼀般使…...
Melis4.0[D1s]:1.启动流程(与adc按键初始化相关部分)跟踪笔记
文章目录1.启动流程1.1 最先进入的文件:head_s.S1.2 start_kernel()函数所在的文件:init.c1.3 input_init()函数所在文件:sys_input.c1.4 INPUT_LKeyDevInit()所在文件:keyboarddev.c1.5 esINPUT_RegLdev()所在文件:in…...
GNU make 中文手册 第三章:Makefile 总述
一、Makefile 总述 3.1 Makefile 的内容 在一个完整的 Makefile 中,包含了 5 个东西:显式规则、隐含规则、变量定义、指示符和注释。关于“规则”、“变量” 和 “Makefile 指示符” 将在后续的章节进行详细的讨论。本章讨论的是一些基本概念。 显式规…...
简历的专业技能怎么写?排版需要注意的事项
一、简历的专业技能怎么写? 首先,先问一下你自己会什么,然后看看你意向的公司需要什么。一般HR可能并不太懂技术,所以他在筛选简历的时候可能就盯着你专业技能的关键词来看。对于公司有要求而你不会的技能,你可以花几 天时间学习一下,然后在简历上可以写上自己了解这个技…...
【Git】为什么需要版本控制?版本控制工具有那些?
目录 一、为什么需要版本控制? 二、版本控制工具有那些? 💟 创作不易,不妨点赞💚评论❤️收藏💙一下 一、为什么需要版本控制? 首先我们要知道什么是版本控制?对版本控制进行文字…...
SSH远程执行Python3 Error: UnicodeEncodeError: ‘ascii‘ codec
首先确定要执行脚本服务器的语言编码环境,执行 # locale -a C en_US.utf8 POSIX # locale LANGen_US.utf8 LC_CTYPE"en_US.utf8" LC_NUMERIC"en_US.utf8" LC_TIME"en_US.utf8" LC_COLLATE"en_US.utf8" LC_MONETARY"…...
极简TypeScript教程--面向对象
在早期的JavaScript开发中(ES5)我们需要通过函数和原型链来实现类和继承,从ES6开始,引入了class关键字,可以更加方便的定义和使用类。TypeScript作为JavaScript的超集,也是支持使用class关键字的࿰…...
java TCP/UDP、Socket、URL网络编程详解
文章目录网络通信协议通信双方地址端口号IP地址InetAddress类Socket 网路编程Socket类的常用构造器Socket类的常用方法UDP协议什么是UDP协议UDP网络编程DatagramSocket 构造方法DatagramSocket 常用方法DatagramPacket常用方法实现步骤单向数据发收的UDP程序双向数据发收的UDP程…...
【C语言】宏
🚀write in front🚀 📜所属专栏:> c语言学习 🛰️博客主页:睿睿的博客主页 🛰️代码仓库:🎉VS2022_C语言仓库 🎡您的点赞、关注、收藏、评论,是…...
【测试面试】自我分析+功能+接口自动化+性能测试面试题(大全),知己知彼百战百胜......
目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 分析自己和面试企业…...
ASE4N65SE-ASEMI高压MOS管ASE4N65SE
编辑-Z ASE4N65SE在TO-220F封装里的静态漏极源导通电阻(RDS(ON))为2.5Ω,是一款N沟道高压MOS管。ASE4N65SE的最大脉冲正向电流ISM为16A,零栅极电压漏极电流(IDSS)为10uA,其工作时耐温度范围为-55~150摄氏度。ASE4N65S…...
MyBatis概述环境搭建(一)
🚗MyBatis学习起始站~ 🚩本文已收录至专栏:数据库学习之旅 👍希望您能有所收获 一.什么是MyBatis (1) 引言 MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDB…...
3.8国际妇女节即将到来,跨境卖家如何做好选品和营销?
不知不觉,时间已来到了2月末,一年一度的三八国际妇女节也即将来临。三八节又称女神节,这不仅是庆祝女性伟大贡献的日子,也是跨境卖家们促销的大好时机。 有数据显示,女性是跨境消费的主力人群,占比超七成&…...
Glue Connector 和 Connection 的关系与区别
AWS Glue作为一种无服务器产品,其运行环境是“不可预知”的,也就是“一个黑盒”,所以如何能连接一些自有数据源是Glue必须考虑并给予满足的,为此,Glue给出的解决方案就是Connector和Connection,一个connect…...
如何使用ngxin的 upstream
1.引言: 1.1反向代理: 反向代理是充当Web服务器网关的代理服务器。当您将请求发送到使用反向代理的Web服务器时,他们将先转到反向代理,由该代理将确定是将其路由到Web服务器还是将其阻止。 这意味着有了反向代理,您…...
Java数组,超详细整理,适合新手入门
目录 一、什么是Java中的数组? 二、数组有哪些常见的操作? 三、数组的五种赋值方法和使用方法 声明数组 声明数组并且分配空间 声明数组同时赋值(1) 声明数组同时赋值(2) 从控制台输入向数组赋值 四、求总和平均 五、求数组中最大值最小值 六…...
1.3数据传输控制方式:IO数据传输控制方式、程序控制(查询)方式、程序中断方式、DMA方式、通道方式、I/O处理机
1.3数据传输控制方式:IO数据传输控制方式、程序控制(查询)方式、程序中断方式、DMA方式、通道方式、I/O处理机程序控制(查询)方式程序中断方式DMA方式通道方式、I/O处理机I/O数据传输方式,由软件到硬件发展…...
Linux 设置语言
文章目录1. 临时设置环境变量2. 默认语言设置3. 语言包4. 安装浏览器 chromium1. 临时设置环境变量 通过设置环境变量,可以使单个命令使用另一种语言LANG $ LANGfr_FR.utf8 date mar. mai 24 12:16:51 CDT 2022后续命令将恢复为使用系统的默认语言进行输出。该loc…...
Python基础-数据类型之集合
一、集合的定义 集合:是一个无序的没有重复元素的序列,因此不能通过索引来进行操作 1:使用set()创建集合 set(object) # 参数为一个序列,整型不能作为参数 set_a set("abcb") print(set_a) # {b, a, c} 2&…...
[Css]Grid属性简单陈列(适合开发时有基础的快速过一眼)
[css进阶]Grid属性简介 文章目录[css进阶]Grid属性简介典型需求网格容器的属性displaygrid-template-columns和grid-template-rowsgrid-template-areasgrid-templategrid-column-gap grid-row-gapgrid-gapjustify-itemsalign-itemsjustify-contentalign-contentgrid-auto-colum…...
基于Dify的智能问答系统:从意图识别到规范化回复的全流程设计
1. 从零开始理解Dify智能问答系统 第一次接触Dify时,我完全被它的可视化编排能力惊艳到了。这个平台就像搭积木一样,让不懂代码的产品经理也能设计出复杂的AI应用。举个实际例子,去年我们团队要做一个游泳健身领域的问答助手,传统…...
OpenSubdiv高级特性:特征自适应细分与硬件曲面细分
OpenSubdiv高级特性:特征自适应细分与硬件曲面细分 【免费下载链接】OpenSubdiv An Open-Source subdivision surface library. 项目地址: https://gitcode.com/gh_mirrors/op/OpenSubdiv OpenSubdiv是一款强大的开源细分曲面库,为3D建模和动画提…...
魔兽地图跨版本转换与优化全指南:从兼容性处理到地图性能提升
魔兽地图跨版本转换与优化全指南:从兼容性处理到地图性能提升 【免费下载链接】w3x2lni 魔兽地图格式转换工具 项目地址: https://gitcode.com/gh_mirrors/w3/w3x2lni 在魔兽争霸III的地图开发领域,版本兼容性始终是开发者面临的核心挑战。不同游…...
QueryExcel:解放双手的Excel批量查询神器,告别Ctrl+F的繁琐时代
QueryExcel:解放双手的Excel批量查询神器,告别CtrlF的繁琐时代 【免费下载链接】QueryExcel 多Excel文件内容查询工具。 项目地址: https://gitcode.com/gh_mirrors/qu/QueryExcel 在日常工作中,你是否也曾被海量Excel文件中的数据查找…...
PyTorch实战:从零构建支持向量机进行图像二分类
1. 支持向量机与图像分类的奇妙碰撞 第一次听说要用支持向量机(SVM)做图像分类时,我脑子里立刻浮现出两个问号:这个传统机器学习算法能处理图像数据吗?为什么要用PyTorch实现而不是直接用scikit-learn?直到亲手实现了整个流程&…...
5G NR实战:LDPC与Polar编码在真实场景中的选择与优化技巧
5G NR实战:LDPC与Polar编码在真实场景中的选择与优化技巧 当你在基站调试现场遇到突发的大流量视频传输需求,或是需要为工业自动化设备配置毫秒级响应的控制信道时,编码方案的选择往往决定着整个通信系统的成败。LDPC和Polar这对5G NR的"…...
车内人体健康检测:赋能智能座舱健康,构建联网化驾乘健康生态
随着人工智能与物联网技术的快速迭代,汽车正从传统交通工具加速演进为集安全、健康、舒适于一体的智慧移动空间。其中,车内智能人体健康检测作为智能座舱健康体系的核心支撑,依托车内联网健康监测技术,打破传统座舱的功能边界&…...
租车宝 token、payload算法分析
声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 部分python代码 url "/queryOr…...
全民养虾潮背后:智能体产业的产业化困局
2026年3月,如果你在科技园区看到有人抱着电脑排长队,或者听到“养虾了吗”的问候,不必感到奇怪。这只“虾”正是开源AI智能体——OpenClaw。从社交平台刷屏的“养龙虾”攻略到GitHub星标数突破27万,超越Linux登顶全球开源项目榜首…...
PXE装机避坑大全:从TFTP根目录设置到Kickstart无人值守的13个常见错误修复
PXE装机避坑大全:从TFTP根目录设置到Kickstart无人值守的13个常见错误修复 在企业级IT运维中,PXE(预启动执行环境)网络装机技术因其高效、自动化的特点,已成为服务器批量部署的标配方案。但看似简单的PXE部署流程背后&…...
