雪花算法和uuid比较

news2024/11/25 3:01:11

1. 雪花算法

​ 现在的服务基本是分布式、微服务形式的,而且大数据量也导致分库分表的产生,对于水平分表就需要保证表中 id 的全局唯一性。对于 MySQL 而言,一个表中的主键 id 一般使用自增的方式,但是如果进行水平分表之后,多个表中会生成重复的 id 值。那么如何保证水平分表后的多张表中的 id 是全局唯一性的呢?

解决方案

  1. UUID作为主键:UUID 生成的是一个无序的字符串,对于 MySQL 推荐使用增长的数值类型值作为主键来说不适合。
  2. 使用 Redis 的自增原子性来生成唯一 id:实现较为复杂,业界使用较少
  3. 雪花算法是其中一个用于解决分布式 id 的高效方案,也是许多互联网公司在推荐使用的。

1.1 雪花算法介绍

​ SnowFlake 算法,是 Twitter 开源的分布式 id 生成算法。其核心思想就是:使用一个 64 bit 的 long 型的数字作为全局唯一 id。在分布式系统中的应用十分广泛,且ID 引入了时间戳,基本上是保持自增的。

​ 由于在Java中64bit的整数是long类型,所以在Java中SnowFlake算法生成的id就是long来存储的。

1.2 雪花算法id结构

img

雪花算法的原理就是生成一个的 64 位比特位的 long 类型的唯一 id。

  • 最高 1 位固定值 0,因为生成的 id 是正整数,如果是 1 就是负数了。
  • 接下来 41 位存储毫秒级时间戳,2^41/(1000606024365)=69,大概可以使用 69 年。
  • 再接下 10 位存储机器码,包括 5 位 datacenterId 和 5 位 workerId。最多可以部署 2^10=1024 台机器。
  • 最后 12 位存储序列号。同一毫秒时间戳时,通过这个递增的序列号来区分。即对于同一台机器而言,同一毫秒时间戳下,可以生成 2^12=4096 个不重复 id。

1.3 雪花算法的作用

  1. 所有生成的id按时间趋势递增
  2. 整个分布式系统内不会产生重复id(因为有datacenterId和workerId来做区分

1.4 优缺点

优点

  • 高并发分布式环境下生成不重复 id,每秒可生成百万个不重复 id。
  • 基于时间戳,以及同一时间戳下序列号自增,基本保证 id 有序递增。
  • 不依赖第三方库或者中间件。
  • 算法简单,在内存中进行,效率高

缺点

  • 不一定是全局递增的(存储机器码导致)
  • 依赖服务器时间,服务器时钟回拨时可能会生成重复 id。算法中可通过记录最后一个生成 id 时的时间戳来解决,每次生成 id 之前比较当前服务器时钟是否被回拨,避免生成重复 id。

注:其实雪花算法每一部分占用的比特位数量并不是固定死的。例如你的业务可能达不到 69 年之久,那么可用减少时间戳占用的位数,雪花算法服务需要部署的节点超过1024 台,那么可将减少的位数补充给机器码用。

雪花算法中 41 位比特位不是直接用来存储当前服务器毫秒时间戳的,而是需要当前服务器时间戳减去某一个初始时间戳值,一般可以使用服务上线时间作为初始时间戳值。

2. uuid

2.1 UUID简介

UUID(Universally Unique Identifier)的标准型式包含32个16进制数字,以连字号分为五段,形式为8-4-4-4-12的36个字符,示例:550e8400-e29b-41d4-a716-446655440000,到目前为止业界一共有5种方式生成UUID,详情见IETF发布的UUID规范 A Universally Unique IDentifier (UUID) URN Namespace。

2.2 UUID的优缺点

优点性能非常高:本地生成,没有网络消耗。

缺点

  • 不易于存储:UUID太长,16字节128位,通常以36长度的字符串表示,很多场景不适用;
  • 信息不安全:基于MAC地址生成UUID的算法可能会造成MAC地址泄露,这个漏洞曾被用于寻找梅丽莎病毒的制作者位置。
  • ID作为主键时在特定的环境会存在一些问题,比如做DB主键的场景下,UUID就非常不适用:
    • MySQL官方有明确的建议主键要尽量越短越好,36个字符长度的UUID不符合要求。
    • 对MySQL索引不利:如果作为数据库主键,在InnoDB引擎下,UUID的无序性可能会引起数据位置频繁变动,严重影响性能。

参考

浅析分布式ID生成算法(UUID、Snowflake、Leaf)

雪花算法(SnowFlake)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/114604.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

结构体(10)

目录 1、结构体的声明 1、结构体的声明 2、结构体变量的定义和初始化 2、结构体成员的访问 3、结构体传参 1、结构体的声明 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。 1、结构体的声明 例如:描述一个学生 注…

KOOM线上APM监控最全剖析

APM,全称是Application Performance Management,也就是应用性能管理,这与我们平时写的业务可能并不相关,但是却承载着App线上稳定的责任。当一款App发布到线上之后,不同的用户有不同场景,一旦App出现了问题…

【云原生系列CKA备考】新建虚拟机安装Ubuntu20.04系统

目录一、环境准备二 、安装虚拟机设置网络其他操作手册:安装 kubeadm 一台兼容的 Linux 主机(或者云主机)。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux 发行版以及一些不提供包管理器的发行版提供通用的指令。 每台机器 2 GB 或更多的 RAM(如果…

数据库,计算机网络、操作系统刷题笔记18

数据库,计算机网络、操作系统刷题笔记18 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开 测开的话,你就得学数据库,sql,oracle…

红中私教:计网那点事(1)

前言 🍀作者简介:被吉师散养、喜欢前端、学过后端、练过CTF、玩过DOS、不喜欢java的不知名学生。 🍁个人主页:红中 🍂专栏地址:网安专栏 光明神已陨落,现在 由计网引领我 破戒了,本来…

前端开发:Vue封装通过API调用的组件的方法

前言 在前端开发中,关于Vue的使用相比大家并不陌生,而且Vue框架的优势也是其他框架所不能比的,尤其是Vue的封装思想更是堪称一绝,还有就是组件化的运用实践过程也是亮点。所以关于Vue框架的使用想必看官都不陌生,而且常…

TCP 的主要特点(计算机网络-运输层)

目录 传输控制协议(Transmission Control Protocol,TCP) TCP 连接与面向字节流的概念 TCP 的连接 UDP与TCP复用的区别 传输控制协议(Transmission Control Protocol,TCP) TCP 是面向连接的运输层协议 …

【算术】数据结构

MySQL性能优化1、数据结构前言2、常见的数据结构2.1 线性表2.1.1 数组2.1.2 链表2.1.3 栈2.1.4 队列2.2 散列表2.3 树2.3.1 二叉树2.4 图1、数据结构前言 数据结构(data structure)是计算机存储、组织数据的方式。是指相互之间存在一种或多种特定关系的数据元素的集合&#xff…

【工作流Activiti7】6、Activiti 7 源码学习

1. 启动分析 源码版本是 7.1.0.M6 首先从 ProcessEngineAutoConfiguration 开始 ProcessEngineAutoConfiguration 是activiti-spring-boot-starter 7.1.0.M6自动配置的入口类,在这里主要看 SpringProcessEngineConfiguration 主要是配置了自动部署 最最最重要的…

后渗透攻击(三)

目录 1、创建新账户 2、获取账号密码 3、远程屏幕控制 在进行提权后我们的操作空间就会大很多,可以进行一系列的创建新账户、获取账号密码、远程操控屏幕等等的操作。该文章就对一些常用的操作进行了整理。 1、创建新账户 查看目标靶机已存在用户 可以在meter…

[Jule CTF 2022] 部分WP

这个比赛参加的人极少,比赛有一星期那么长,快结束的时候来了个大牛,一下上到12000,我这6K只能排到第二了。不过题还是挺不错的。只是入口不是人链接,得自己输才能进,可能很多人因为这个没参加。 Crypto E…

【工作流Activiti7】5、Activiti7 多实例子流程

顾名思义,子流程是一个包含其他活动、网关、事件等的活动,这些活动本身形成了一个流程,该流程是更大流程的一部分。 使用子流程确实有一些限制: 一个子流程只能有一个none类型的启动事件,不允许有其他类型的启动事件…

C语言—结构体

结构体&#xff1a;将不同数据类型组合成一个新的数据类型&#xff1b; #include <stdio.h> struct Person {char name[50];int age;bool gender; }; int main() {} 定义了一个结构体Person&#xff0c;它包含一个字符数组成员name&#xff0c;int类型的age和bool类型的…

【生信原理】初探芯片表达谱分析

初探芯片表达谱分析 文章目录初探芯片表达谱分析实验目的实验内容实验题目实验过程数据的获取、解压与读取数据预处理&#xff08;背景纠正、标准化和探针信号汇总等&#xff09;数据过滤&#xff08;探针过滤&#xff09;探针注释&#xff08;添加基因注释信息&#xff09;lim…

Excel之INDIRECT函数实现某列元素上下翻转

Excel之INDIRECT函数实现某列元素上下翻转方法1&#xff1a;降序按钮1.0 使用条件1.1 选中元素序号列->排序和筛选->降序1.2 排序提醒对话框->排序1.3 处理后结果方法2&#xff1a;Indirect函数2.0 方法一的不足。2.1 INDIRECT函数处理及结果2.2 空白单元格的恢复及结…

客快物流大数据项目(一百):ClickHouse的使用

文章目录 ClickHouse的使用 一、使用Java操作ClickHouse 1、构建maven工程

用HTML+CSS构建一个绚丽的登录页面

用HTMLCSS构建一个绚丽的登录页面 参考文章&#xff1a; 动态水滴页面 自动切换背景的登录页面 登录页面代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" c…

[~/vulhub]/log4j/CVE-2021-44228-20221225

[~/vulhub]/log4j/CVE-2021-44228 ┌──(kwkl㉿kwkl)-[~/vulhub] └─$ cd log4j/CVE-2021-44228 ┌──(kwkl㉿kwkl)-[~/vulhub/log4j/CVE-2021-44228] └─$ dir 1.png 2.png docker-compose.yml README.md README.zh-cn.md┌──(kwkl㉿kwkl)-[~/vulhub/log4j/CVE-2021…

JSP ssh学生信息管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 JSP ssh 学生信息管理系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用 B/S模式开发。开发环境为TOMCAT7.…

TCP 报文段的格式(计算机网络-运输层)

目录 TCP 报文段的格式 TCP 报文段的格式 TCP虽然是面向字节流的&#xff0c;但TCP传送的数据单元却是报文段 TCP 报文段分为首部和数据两部分。TCP 的全部功能都体现在它首部中各字段的作用 TCP 报文段首部的前 20个 字节是固定的&#xff0c;后面有 4N 字节是根据需要而增加…