一个类似 Twitter 雪花算法 的 连续序号 ID 产生器 SeqIDGenerator

项目地址 :     https://github.com/kelin-xycs/SeqIDGenerator

今天 QQ 群 里有网友问起产生唯一 ID 的方法 有哪些,  讨论了各种方法 。

有网友提到 Twitter 的 雪花算法 :       https://blog.csdn.net/w200221626/article/details/52064976

我觉得 GUID 的 优点 是 简单 高效, 缺点 是 可读性 比较差 。

高效 是指 相比起 要到 数据库 读取 种子(当前最大序号) 等的方式,  同时 也 简单,  不会出什么问题 。

如果 对 可读性 有要求, 比如 要 显示给 用户 看,  或者 便于 维护,  可以使用 针对业务 产生的 连续序号 ID , 比如 订单号 。

如果 对 可读性 没什么要求, 那么 用 GUID 就行 。 或者说, 对 可读性 没太多要求 的 场合 可以 通用  GUID 。

但很多时候 我们 也希望使用 可读性好的 连续序号 ID ,  所以就想有一个 简单的 通用的 产生 连续序号 ID 的 方法 。

所以, 就想出了一个 和 Twitter 雪花算法 类似 的 算法 :

这种算法 产生的 ID 格式如下 :

时间戳-机器ID-序号

时间戳 就是 “20181106213913983”  这样,  表示  2018年11月06日21点39分13秒983毫秒  ,     时间戳 取到 毫秒 。

机器ID 就是 计算机 ID, 或者说 服务器 ID,  因为现在 高并发 负载均衡 集群 很常见, 所以需要考虑 多台 Server 并行作业 时 的 情况 。 并行作业 的 Server 之间的 连续序号 ID 不能重复, 对此, Twitter 雪花算法 是 通过 给 每个 Server 一个 机器ID 来区分 , 所以 我们 也学 Twitter 雪花算法 这样 。

机器ID 在 App.config 中 配置 :

机器ID 可以 自己随便配置, 不过考虑到 连续序号 ID 的 排序 查询 等,  取成 固定位数 的 数字 比较好 ,  比如 上图 中的  “0000”,

4 位 数字 可以支持  1 万  台 Server  (0000 ~ 9999) 。

序号 是指 这台计算机上 当前这一毫秒 内 连续序号 ID 的 序号, 这一毫秒内 第一个 连续序号 ID 的 序号 是 0, 第二个是 1, 第三个是 2, 第四个是 3  ……   ,  以此类推 。 到下一毫秒 序号 会重置为 从 0 重新开始 。

现在程序中写死的 序号 格式 是 4 位 数字,  4 位 数字 可以支持在  一台计算机(多核)上   每毫秒 产生  1 万  个  ID  (0000 ~ 9999)  。

效果如下 :        (运行 解决方案 中的 Demo 项目 就可看到)

原文地址:https://www.cnblogs.com/KSongKing/p/9918412.html

时间: 2024-10-09 13:38:25

一个类似 Twitter 雪花算法 的 连续序号 ID 产生器 SeqIDGenerator的相关文章

mybatis plus 主键生成 Twitter雪花算法 id 及修改id为字符型

mybatis plus配置主键生成策略为2,就是 使用Twitter雪花算法 生成id spring boot中配置为: GlobalConfiguration conf = new GlobalConfiguration(new LogicSqlInjector()); conf.setIdType(5); 这样生成的是long类型的,如果想把这个id 转为字符串类型,则配置主键生成策略为5就行了 https://gitee.com/baomidou/mybatis-plus/blob/de

Java中SnowFlake 雪花算法生成全局唯一id中的问题,时间不连续全为偶数解决

package com.example.springbootshardingjdbc.util; import java.io.FileOutputStream; /** * 描述: Twitter的分布式自增ID雪花算法snowflake (Java版) * * @author * @create 2018-03-13 12:37 **/ public class SnowFlake { /** * 起始的时间戳 */ private final static long START_STMP

snowflake 雪花算法 分布式实现全局id生成

snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID. 这种方案大致来说是一种以划分命名空间(UUID也算,由于比较常见,所以单独分析)来生成ID的一种算法,这种方案把64-bit分别划分成多段,分开来标示机器.时间等. 其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号,最后还有一个符号位,永远是0. 比如在snowflake中的64-bit分别表示如下图(图片来自网络)

用spring-data-redis实现类似twitter的网站(转)

1. spring-data-redis简介 封装了一下redis的客户端,使得使用起来更方便. 优点是把客户端连接放到一个连接池里,从而提高性能.还有就是可以不同的客户端之间实现切换,而不用改一行代码(Spring惯用的一个手法). 本文写作时最新版是1.3, 目前支持下面4种java客户端,可以自由切换而不用改代码. Jedis JRedis SRP Lettuce 2. twitter简介 twitter如果没用过的话,可以理解成类似于国内的新浪微博.因为微博的访问量和使用人数极大,用传统

雪花算法生成一个id

package com.shopping.test; import java.text.SimpleDateFormat; import java.util.Date; /***** * 雪花算法根据时间戳生成有序的 64 bit 的 Long 类型的唯一 ID * * 各 bit 含义: * 1 bit: 符号位,0 是正数 1 是负数, ID 为正数,所以恒取 0 * 41 bit: 时间差,我们可以选择一个参考点,用它来计算与当前时间的时间差 (毫秒数),41 bit 存储时间差,足够使用

雪花算法python实现

雪花算法-Snowflake Snowflake是Twitter提出来的一个算法,其目的是生成一个64bit的整数: 1bit:一般是符号位,不做处理 41bit:用来记录时间戳,这里可以记录69年,如果设置好起始时间比如今年是2018年,那么可以用到2089年,到时候怎么办?要是这个系统能用69年,我相信这个系统早都重构了好多次了. 10bit:10bit用来记录机器ID,总共可以记录1024台机器,一般用前5位代表数据中心,后面5位是某个数据中心的机器ID 12bit:循环位,用来对同一个毫

雪花算法解析 生成uuid

package com.grid.service; public class SnowflakeIdWorker { /** * 雪花算法解析 结构 snowflake的结构如下(每部分用-分开): * 0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000 * 第一位为未使用,接下来的41位为毫秒级时间(41位的长度可以使用69年),然后是5位datacenterId和5位workerId

雪花算法(snowflake)delphi版

雪花算法简单描述: + 最高位是符号位,始终为0,不可用. + 41位的时间序列,精确到毫秒级,41位的长度可以使用69年.时间位还有一个很重要的作用是可以根据时间进行排序. + 10位的机器标识,10位的长度最多支持部署1024个节点. + 12位的计数序列号,序列号即一系列的自增id,可以支持同一节点同一毫秒生成多个ID序号,12位的计数序列号支持每个节点每毫秒产生4096个ID序号. 看的出来,这个算法很简洁也很简单,但依旧是一个很好的ID生成策略.其中,10位器标识符一般是5位IDC+5

雪花算法

雪花算法简单描述: 可以用在分布式框架最高位是符号位,始终为0,不可用. 41位的时间序列,精确到毫秒级,41位的长度可以使用69年.时间位还有一个很重要的作用是可以根据时间进行排序. 10位的机器标识,10位的长度最多支持部署1024个节点. 12位的计数序列号,序列号即一系列的自增id,可以支持同一节点同一毫秒生成多个ID序号,12位的计数序列号支持每个节点每毫秒产生4096个ID序号. 原文地址:https://www.cnblogs.com/inbeijing/p/10266120.ht