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

springboot 分布式全局唯一id的生成-雪花算法snowflake

一 背景描述

1.1 问题产生

在分布式系统中,怎么使用全局唯一id?

在分布式是,微服务的架构中,或者大数据分库分表中,多个不同节点怎么保持每台机器生成的主键id不重复,具有唯一性?

  1. 方案1:mysql的自增主键; 设定一定的步长;如3台机器,3台节点初始值1,2,3,步长为3;机器A:1,4,7,10;机器B:2,5,8,11; 机器c:3,6,9,12
  2. 方案2:使用uuid,无序且生成的串比较长,与mysql官方建议尽量使用较短的字符串冲突
  3. 使用redis的原子性性产生主键,但是使用过程前期比较麻烦,需要搭建配置一堆东西。

这时,雪花算法是其中一个用于解决分布式 id 的高效方案,也是许多互联网公司在推荐使用的。

二 雪花算法

2.1 雪花算法

雪花算法:解决分布式高并发集群中,提供产生全局唯一的id,就是生成一个的 64 位比特位的 long 类型的唯一 id

2.2 雪花算法的结构

最高 1 位固定值 0,因为生成的 id 是正整数,如果是 1 就是负数了。

接下来 41 位存储毫秒级时间戳,2^41/(1000*60*60*24*365)=69,大概可以使用 69 年。

再接下 10 位存储机器码,包括 5 位 datacenterId 和 5 位 workerId。最多可以部署 2^10=1024 台机器。

最后 12 位存储序列号。同一毫秒时间戳时,通过这个递增的序列号来区分。即对于同一台机器而言,同一毫秒时间戳下,可以生成 2^12=4096 个不重复 id。

 2.3 雪花算法的使用

可以将雪花算法作为一个单独的服务进行部署,然后需要全局唯一 id 的系统,请求雪花算法服务获取 id 即可。例如机房号+机器号,机器号+服务号,或者是其他可区别标识的 10 位比特位的整数值都行。

2.4 案例

 2.5 优缺点

优点:

高并发分布式环境下生成不重复 id,每秒可生成百万个不重复 id。

基于时间戳,以及同一时间戳下序列号自增,基本保证 id 有序递增。

般分布式ID只要求趋势递增,并不会严格要求递增,90%的需求都只要求趋势递增)

缺点:

服务器时钟回拨时可能会生成重复 id解决办法:

百度开源的分布式唯一ID生成器UidGenerator

Leaf-- 美团点评分布式ID生成系统

相关文章:

  • 如何使用VMware虚拟机(带你快速了解)
  • Python---学生管理系统(pyinstaller)
  • 客快物流大数据项目(一百零八):Spring Cloud 技术栈
  • ZYNQ IP核之RAM
  • Day10 C++STL入门基础知识七——案例1【评委打分】
  • 计算机相关专业混体制的解决方案(考公务员)
  • OpenCV-PyQT项目实战(1)安装与环境配置
  • 【HTML | CSS】春节将至,为网页挂上精美的灯笼吧(附源码)程序员的浪漫
  • 字节青训前端笔记 | Next.js 入门
  • 下载Windows ISO镜像的方法 (超详细 适合新手入门)
  • OpenCV实战(8)——直方图详解
  • 这些低代码平台,你是否知悉?
  • TCP/IP网络编程——基于 TCP 的服务端/客户端(下)
  • 【高阶数据结构】海量数据如何处理? (位图 布隆过滤器)
  • ARP攻击和欺骗原理讲解
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 10个最佳ES6特性 ES7与ES8的特性
  • javascript 哈希表
  • MySQL QA
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 从零搭建Koa2 Server
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 精彩代码 vue.js
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 微信支付JSAPI,实测!终极方案
  • 追踪解析 FutureTask 源码
  • const的用法,特别是用在函数前面与后面的区别
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • #在 README.md 中生成项目目录结构
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (06)金属布线——为半导体注入生命的连接
  • (2020)Java后端开发----(面试题和笔试题)
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (六)激光线扫描-三维重建
  • (南京观海微电子)——I3C协议介绍
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (一)基于IDEA的JAVA基础12
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转载)CentOS查看系统信息|CentOS查看命令
  • ***通过什么方式***网吧
  • .gitignore文件—git忽略文件
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET Framework .NET Core与 .NET 的区别
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .NET 依赖注入和配置系统
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • .Net转Java自学之路—SpringMVC框架篇六(异常处理)
  • @ModelAttribute使用详解
  • @RequestMapping-占位符映射