一个类似 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 项目 就可看到)
一个类似 Twitter 雪花算法 的 连续序号 ID 产生器 SeqIDGenerator的更多相关文章
- Twitter雪花算法 SnowFlake算法 的java实现
概述 SnowFlake算法是Twitter设计的一个可以在分布式系统中生成唯一的ID的算法,它可以满足Twitter每秒上万条消息ID分配的请求,这些消息ID是唯一的且有大致的递增顺序. 原理 Sn ...
- mybatis plus 主键生成 Twitter雪花算法 id 及修改id为字符型
mybatis plus配置主键生成策略为2,就是 使用Twitter雪花算法 生成id spring boot中配置为: GlobalConfiguration conf = new GlobalC ...
- 基于雪花算法的增强版ID生成器
sequence 基于雪花算法的增强版ID生成器 解决了时间回拨的问题 无需手动指定workId, 微服务环境自适应 可配置化 快速开始 依赖引入 <dependency> <gro ...
- java 雪花算法实现获取分布式id
import java.lang.management.ManagementFactory; import java.net.InetAddress; import java.net.NetworkI ...
- Twitter雪花算法SnowFlake算法的java实现
https://juejin.im/post/5c75132f51882562276c5065 package javaDemo; /** * twitter的snowflake算法 -- java实 ...
- snowflake 雪花算法 分布式实现全局id生成
snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID. 这种方案大致来说是一种以划分命名空间(UUID也算,由于比较常见,所以单独分析)来生成ID的一种算法,这种方案 ...
- 雪花算法生成全局唯一ID
系统中某些场景少不了全局唯一ID的使用,来保证数据的唯一性.除了通过数据库自带的自增id来保证 id 的唯一性,通常为了保证的数据的可移植性会选择通过程序生成全局唯一 id.百度了不少php相关的生成 ...
- 分布式ID的雪花算法及坑
分布式ID生成是目前系统的常见刚需,其中以Twitter的雪花算法(Snowflake)比较知名,有Java等各种语言的版本及各种改进版本,能生成满足分布式ID,返回ID为Long长整数 但是这里有一 ...
- Snowflake(雪花算法),什么情况下会冲突?
文章首发在公众号(龙台的技术笔记),之后同步到博客园和个人网站:xiaomage.info 分布式系统中,有一些需要使用全局唯一 ID 的场景,这种时候为了防止 ID 冲突可以使用 36 位的 UUI ...
随机推荐
- 使用FileResult导出Excel数据文件
用的是Html拼接成Table表格的方式,返回 FileResult 输出一个二进制的文件. 第一种:使用FileContentResult // 通过使用文件内容,内容类型,文件名称创建一个File ...
- L316 波音737Max 危机
Boeing Scrambles To Restore Faith In Its 737 MAX Airplane After Crashes In the wake of two deadly cr ...
- shell脚本实例-while实现批量创建用户
#!/usr/bin/bash while read line #读取一行结果 do if [ ${#line} -eq 0 ];then #如果有空行的话就跳过这次循环 contiune fi us ...
- php优秀框架codeigniter学习系列——安装,配置
下载 可在官网下载,我使用的是CodeIgniter-3.1.7. 目录 打开程序目录,可看到目录结构. 我这里做一点小的修改,新建了一个 index 目录,将 index.php 和一些静态文件放入 ...
- Python 连接 redis 模块
redis 模块使用可以分类为: 连接方式 连接池 操作 String操作 Hash操作 List操作 Set操作 Sort Set操作 管道 发布订阅 (1)操作模式 redis提供两个类Redis ...
- 2019-03-19-day014-内置函数
昨日回顾 装饰器 对扩展开放 对修改封闭 不改变原调用方式 def a(c): def b(*args,**kwargs): c(*args,**kwargs) return b a() def a( ...
- PCMU G.711U/PCMA G.711A简介
PCMA(G.711A) 类型:Audio 制定者:ITU-T 所需频宽:64Kbps(90.4) 特性:PCMU和PCMA都能提供较好的语音质量,但是它们占用的带宽较高,需要64kbps. 优点:语 ...
- 第七十四课 图的遍历(BFS)
广度优先相当于对顶点进行分层,层次遍历. 在Graph.h中添加BFS函数: #ifndef GRAPH_H #define GRAPH_H #include "Object.h" ...
- libev
libev是一个**事件驱动库**,它需要循环探测事件是否发生,在Linux上实际是封装了epoll等系统调用. 其循环过程由ev_loop( )函数设置,循环体是ev_loop结构. //创建事件循 ...
- Pycharm出现Segmentation fault...(interrupted by signal 11: SIGSEGV)的解决方法
众所周知,用pycharm远程服务器debug代码已经成为学习深度学习相关代码的有力工具,但是最近创建了一个虚拟环境,进行debug的时候,莫名会出现下面这个错误,看的我都抽风了 bash: line ...