基于snowflake的Id序列号生成器
背景
在分布式微服务系统中,通常需要全局唯一的序列号,需求实现简单高效,通常的做法可以用数据库的自增id,UUID生成等。但数据库自增id局限在于依赖于数据库表,在效率上有所折扣,尤其是高并发量的场景。而UUID一般比较长,关键是无序的。twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移到Cassandra,因为Cassandra没有顺序ID生成机制,所以开发了这样一套全局唯一ID生成服务。
snowflake结构
Bits | 名字 | 说明 |
---|---|---|
1 | 符号位 | 0,通常不使用 |
41 | 时间戳 | 精确到毫秒数,支持 2 ^41 /365/24/60/60/1000=69.7年 |
10 | 工作进程编号 | 支持 1024 个进程 |
12 | 序列号 | 每毫秒从 0 开始自增,支持 4096 个编号 |
snowflake生成的ID整体上按照时间自增排序,一共加起来刚好64位,为一个Long型(转换成字符串后长度最多19)。并且整个分布式系统内不会产生ID碰撞(由datacenter和workerId作区分),工作效率较高,经测试snowflake每秒能够产生26万个ID。
应用与实现
定义接口KeyGenerator,有方法generateKey()。实现类DefaultKeyGenerator,是默认的id生成器。对于工作线程的确定,可以借助通过 Zookeeper、Consul、Etcd 等提供分布式配置功能的中间件,也可以直接通过该机器的ip获取工作进程编号。
目前,国内很多大型互联网公司都是基于这种方式实现的id生成器,一些开元的分布式数据库中间件也是基于此算法实现数据库主键的,比如myCat, sharding-JDBC等。
基于snowflake的Id序列号生成器相关推荐
- oracle 全局id,基于SnowFlake 全局ID 生成器 go-id-worker
snowflake的结构如下(每部分用-分开): 0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 0000000 ...
- 基于美团Leaf-Segment的双buffer方案实现序列号生成器
业务背景 有时项目中对于流水号有一些特殊的需求.比如,和业务A有关数据,我们在落库时想要给每条数据添加一个流水号字段,用于作为全局唯一标识.流水号格式规则如下,如:BTA(业务A代号)+年月日(202 ...
- 基于单例模式的多键值序列号生成器实现(支持缓存)
之前在BlogJava上发表过这篇文章,那时没怎么做整理.想不到已经有博友把它弄到ITEye来了(虽然写得水平差,但还是希望那位博友能注明是转载的).这次稍作了整理,自己也加深下印象. 使用场景:用于 ...
- 序列号及序列号生成器(号段模式,数据库模式)详细介绍(建议收藏)
前言 现如今,数据的唯一性和可追溯性变得越来越重要.从简单的数据库主键到复杂的分布式系统,唯一标识符在各种场景中都发挥着关键作用.序列号,作为一种广泛应用的唯一标识符,为我们提供了确保数据完整性和一致 ...
- 微信序列号生成器架构设计及演变
一.摘要 微信在立项之初,就已确立了利用数据版本号实现终端与后台的数据增量同步机制,确保发消息时消息可靠送达对方手机,避免了大量潜在的家庭纠纷.时至今日,微信已经走过第五个年头,这套同步机制仍然在消息 ...
- 加密解密软件VMProtect教程(八)许可制度之序列号生成器
VMProtect是新一代软件保护实用程序.VMProtect支持德尔菲.Borland C Builder.Visual C/C++.Visual Basic(本机).Virtual Pascal和 ...
- 万亿级调用系统:微信序列号生成器架构设计及演变
"每天万亿级调用的重量级系统,每次申请序列号平时调用耗时1ms,99.9%的调用耗时小于3ms,服务部署于数百台4核CPU服务器上!" 老司机介绍: 曾钦松,微信高级工程师,目前负 ...
- 雪花算法snowflake分布式id生成原理详解,以及对解决时钟回拨问题几种方案讨论
文章目录 一.前言 二.雪花算法snowflake 1.基本定义 2.snowflake的优缺点 三.Java代码实现snowflake 1.组装生成id 2.计算最大值的几种方式 3.反解析ID 4 ...
- 万亿级调用下的优雅——微信序列号生成器架构设计及演变(上)
版权声明:本文由曾钦松原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/200 来源:腾云阁 https://www.qcl ...
- java查询序列_基于JAVA的苹果序列号查询api调用代码实例
代码描述:基于JAVA的苹果序列号查询api调用代码实例 关联数据:苹果序列号 接口地址:http://www.juhe.cn/docs/api/id/37 1.[代码][Java]代码 import ...
最新文章
- 在CISCO路由器上实现CHAP认证
- 在线CSS工具及相关资源收集
- 迁移数据文件到ASM【转】
- LINUX修改文件权限 学习
- windows中wnmp设置nginx启动脚本
- 使用halcon将一个圆上的点拟合成圆形并且求出圆心
- 1090 Highest Price in Supply Chain (25)
- 为什么我不推荐你使用vue-cli创建脚手架?
- 文本聚类kmeans
- 博弈论总结(题目合集)
- Python神经网络学习--神经网络知识先导(一)--什么是神经网络?
- 详解闲鱼推荐系统(长文收藏)
- Log-normal distribution对数正态分布
- 【小程序】小程序安卓,ios,ipad兼容问题
- pfamscan 的使用_InterProScan的使用教程
- Java程序员如何能进入阿里、大众点评这样的大型互联网公司?
- 【面试】网易游戏面试题目整理及答案(3)
- 《Redis学习三之面试》
- Windows 平台下面的IOCP技术 Linux下面Epoll 还有FreeBSD下面Kqueue的应用了。跨平台库行业里面最出名的莫过于ACE、ASIO(Boos公司)两大支持库支持IOCP
- NCH SoundTap Plus for mac(苹果电脑录音软件)