观看视频

基础知识

基本原理:由4部份组成一个64字节的整数(bigint).

  • 字节计算读取顺序从左至右,下标计数从0开始.
  • 第0位为符号位:正数是0,负数是1.但是有些语言没有无符号整数(java\PostgreSQL),为保证可移植性因此固定为0。
  • 第1-41位为时间戳:单位为毫秒,时间戳只有41位,所以值范围为0-2199023255551毫秒,最多可以存储69年的数据.因为值范围较小,不能直接使用UNIX时间戳,应该使用时间戳的差值(当前时间-你指定的开始时间).你指定的开始时间可以是任意时间,比如系统于2020年开始开发,这个时间可以指定为2020-1-1.
select (2199023255551::bigint) / (24::bigint * 60 * 60 * 1000) / 365
  • 第42-51位为机器id:可以自己组合这10bit数据.例如:如果主机都在C类IP段之内(0-255),可以取IP地址的最后一位做为机器id.此时只需要8字节即可,多出来的2字节可以分配给时间戳,此时时间戳占用43字节,值范围为0-8796093022207,存储范围可以扩大至278年.
select (((1::bigint)<<43) - 1) / (24::bigint * 60 * 60 * 1000) / 365
  • 第52-63位顺序号:值范围为0-4095,为同一时间戳同一个机器可以生成的ID个数,也就是同一毫秒同一个机器最多可以生成4095个ID.
select (((1::bigint)<<12) - 1)

位运算技巧

要设置bit位的任一1位为0时,将该位设置为0,其它位设置为1,然后执行&运算.例如将第7位设置为0

select (32767::bit(16)) &  x'FF7F'
-- 32767二进制表示为 01111111 11111111
-- FF7F二进制表示为  11111111 01111111
-- 结果             01111111 01111111

要设置bit位的任一1位为1时,将该位设置为1,其它位设置为0,然后执行|运算.例如将第7位设置为1

select (0::bit(16)) &  x'0080'
-- 0二进制表示为     00000000 00000000
-- 0080二进制表示为  00000000 10000000
-- 结果             00000000 10000000

用SQL实现雪花算法snowflake

select id>>22,((id<<41)&9223372036854775807)>>53,((id<<51)&9223372036854775807)>>51
from (select (((2199023255551::bigint)<<22) | (1023<<12) | 4095 ) as id) as tmp
  • 2199023255551:为时间戳的最大值
  • 1023:为机器id的最大值
  • 4095:为顺序号的最大值
  • 注意:如果输入值超过最大值将无法还原数据,因此在生成时必须先范围范围是否在有效范围内.
  • 9223372036854775807是确保符号位设置0,因为算法规定符号位必须0.
--9223372036854775807的二进制
0111111111111111111111111111111111111111111111111111111111111111
  • 在机器id和顺序号左移位时必须保持符号位,因此机器id左移41位,顺序号左移51位.左移位完成后,符号位不一定为0,因此在左移位后必须保证符号位为0.

变种

在使用分布式程序时,此时同一毫秒内同一台机器只会产生很少量的序列号,因此可以将工作机器id扩充至12位、14位、16位,序列号使用10位、8位、6位.具体如何选择请结合需求.

  • 工作机器id12位值范围:1-4095
  • 工作机器id14位值范围:1-16383
  • 工作机器id16位值范围:1-65535
  • 序列号10位值范围:1-1023
  • 序列号8位值范围:1-255
  • 序列号6位值范围:1-63

工作机器id12位,序列号10位

select id>>22,((id<<41)&9223372036854775807)>>51,((id<<53)&9223372036854775807)>>53
from (select (((2199023255551::bigint)<<22) | (4095<<10) | 1023 ) as id) as tmp

工作机器id14位,序列号8位

select id>>22,((id<<41)&9223372036854775807)>>49,((id<<55)&9223372036854775807)>>55
from (select (((2199023255551::bigint)<<22) | (16383<<8) | 2 ) as id) as tmp

工作机器id16位,序列号6位

select id>>22,((id<<41)&9223372036854775807)>>47,((id<<57)&9223372036854775807)>>57
from (select (((2199023255551::bigint)<<22) | (65535<<6) | 63 ) as id) as tmp

PostgreSQL分布式id-雪花算法snowflake相关推荐

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

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

  2. 【分布式ID】键高并发 分布式 全局唯一 ID 雪花算法 snowflake

    文章目录 1.概述 2.为什么 3.要求 3.1 软件要求 3.2 机器要求 4.区别 4.1 UUID 4.2 MySQL数据库自增ID 4.3 Redis数据库自增ID 5. 雪花算法 5.1 核 ...

  3. java不规则算法_分布式id生成算法 snowflake 详解

    背景 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识.如在支付流水号.订单号等,随者业务数据日渐增长,对数据分库分表后需要有一个唯一ID来标识一条数据或消息,数据库的自增ID显然不能满足需 ...

  4. 分布式ID——雪花算法

    背景 随着现在业务量的越来越大,数据库的划分也变的越来越细,分库分表的理念也渐渐的落地,自增主键或者序列之类的主键id生成方式已经不再满足需求,所以分布式ID的生成就应运而生,总的来说就是生成规则更加 ...

  5. 分布式自增ID雪花算法snowflake (Java版)

    概述 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的. 有些时候我们希望能使用一种 ...

  6. 分布式ID雪花算法-解析

    SnowFlake算法生成id的结果是一个64bit大小的整数,它的结构如下图: 1位,不用.二进制中最高位为1的都是负数,但是我们生成的id一般都使用整数,所以这个最高位固定是0 41位,用来记录时 ...

  7. Twitter的分布式雪花算法 SnowFlake 每秒自增生成26个万个可排序的ID (Java版)

    分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的. 有些时候我们希望能使用一种简单一 ...

  8. Twitter的分布式雪花算法 SnowFlake

    为什么80%的码农都做不了架构师?>>>    原理 Twitter的雪花算法SnowFlake,使用Java语言实现. SnowFlake算法产生的ID是一个64位的整型,结构如下 ...

  9. 【分布式ID】理解Snowflake算法的实现原理

    1.概述 转载:冷饭新炒:理解Snowflake算法的实现原理 我上次也看了一个视频讲解:[分布式ID]键高并发 分布式 全局唯一 ID 雪花算法 snowflake 2.前提# Snowflake( ...

最新文章

  1. codeforces 贪心+优先队列_贪心(贪婪),在你们家乡话中怎么说·
  2. jQuery Ajax调用后如何管理重定向请求
  3. 值得研究的 开源图形引擎
  4. HTTP 代理如何正确处理 Cookie
  5. 动态网页开发技术(二):Servlet
  6. 单元格内多个姓名拆分成一列_把订单按货品拆分成多行
  7. ubuntu各大学更新源(教育网速度都很快)
  8. Nginx 与 FPM 的工作机制
  9. Handheld Group推出Algiz平板,内置RFID读取器
  10. Office LTSC 2021 for Mac
  11. 分类数据转换为树形结构
  12. 韩顺平 零基础30天学会Java 学习笔记
  13. 关于方志鹏博主springcloud系列教程提示:Could not resolve placeholder 'foo' in value ${foo}报错
  14. oeasy教您玩转vim - 52 - # 正则查找
  15. 连载]第四讲 测量准确度、重复性、复现性及标准偏差
  16. webview 支付宝、微信支付 QQ登录
  17. 从数据库中查询列表倒序排列(按照时间顺序)
  18. golang 读一行_与golang合作的第一步
  19. WEB开启防调试模式
  20. 十几个CSS高级常见技巧汇总(虚线框、三角形、优惠券卡券、滚动条、多行溢出...)...

热门文章

  1. 003A-设备连接方式、以太帧类型、mac地址
  2. Win10+GTX 1660 SUPER安装Cuda11.5.1+cudnn8.3.0
  3. html5是什么材料,HTML_HTML5 Canvas标签使用收录, 一、基本概念 什么是Canva - phpStudy...
  4. SpringBoot + Spring Security 学习笔记(一)自定义基本使用及个性化登录配置
  5. 在vs code中报错:[ts]应为;
  6. 邮箱群发邮件的小技巧
  7. java安卓播放器添加选集_Android使用vitamio插件实现视频播放器
  8. python变量赋值及其数据类型
  9. 新时代的互联网打印—小马快印
  10. 科技型中小企业税收优惠政策