你不得不知的几个互联网ID生成器方案

2023-10-26

服务化、分布式已成为当下系统开发的首选,高并发操作在数据存储时,需要一套id生成器服务,来保证分布式情况下全局唯一性,以确保系统的订单创建、交易支付等场景下数据的唯一性,否则将造成不可估量的损失。

基于时间戳

比如流水号规则如下:XX-YYYYMMDD-N位随机数,这也是企业级应用开发常用的规则。此流水号对人比较友好,可识别性高,但容量受后面随机数的限制,且数据量越大,生成时难度越高。前三部分每天的流水号基本固定,后面的N位随机数生成后,需要校验此前不存在,可依赖redis的set机制,每天的随机数都写到一个set集合中[set容易达42亿之多,完全够用],重新生成后要与set集合作比对,以确保其唯一性。一天内不重复,再结合确定日期来保证其唯一性。

N位随机数生成时,可基于系统时间戳,再与一个大数取模生成。

UUID/GUID

最简单直接暴力的方式,虽然能够保证ID的唯一性,但是,它无法满足业务系统需要的很多其他特性,例如:时间粗略有序性,可反解和可制造型。另外,UUID产生的时候使用完全的时间数据,性能比较差,并且UUID比较长,占用空间大,间接导致数据库性能下降,更重要的是,UUID并不具有有序性。系统容量较小的时候可以采用,变大后不建议采用此方式。

Vesta

GitHub 地址:https://github.com/robertleepeak/vesta-id-generator

Vesta是一款通用的ID产生器,互联网俗称统一发号器,它具有全局唯一、粗略有序、可反解和可制造等特性,它支持三种发布模式:嵌入发布模式、中心服务器发布模式、REST发布模式,根据业务的性能需求,它可以产生最大峰值型和最小粒度型两种类型的ID,它的实现架构使其具有高性能,高可用和可伸缩等互联网产品需要的质量属性,是一款通用的高性能的发号器产品。 提供4种应用部署方式,具体使用依场景而定:

  • REST发布模式(Netty)

  • REST发布模式(Tomcat)

  • 中心服务器发布模式

  • 嵌入式发布模式

Twitter-Snowflake

GitHub 地址:https://github.com/twitter/snowflake

Twitter-Snowflake算法产生的背景相当简单,为了满足Twitter每秒上万条消息的请求,每条消息都必须分配一条唯一的id,这些id还需要一些大致的顺序(方便客户端排序),并且在分布式系统中不同机器产生的id必须不同。

snowflake的结构如下(用-分开):

0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000

第一位为未使用,接下来的41位为毫秒级时间(41位的长度可以使用69年),然后是5位datacenterId和5位workerId(10位的长度最多支持部署1024个节点) ,最后12位是毫秒内的计数(12位的计数顺序号支持每个节点每毫秒产生4096个ID序号)

一共加起来刚好64位,为一个Long型。(转换成字符串长度为18)

 snowflake生成的ID整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和workerId作区分),并且效率较高。据说:snowflake每秒能够产生26万个ID。

基于redis的分布式ID生成器

GitHub 地址:https://github.com/hengyunabc/redis-id-generator

依赖redis的EVAL,EVALSHA两个命令,利用redis的lua脚本执行功能,在每个节点上通过lua脚本生成唯一ID。 生成的ID是64位的:

  • 使用41 bit来存放时间,精确到毫秒,可以使用41年。

  • 使用12 bit来存放逻辑分片ID,最大分片ID是4095

  • 使用10 bit来存放自增长ID,意味着每个节点,每毫秒最多可以生成1024个ID

Redis提供了TIME命令,可以取得redis服务器上的秒数和微秒数。因些lua脚本返回的是一个四元组。

second, microSecond, partition, seq

客户端要自己处理,生成最终ID。

((second * 1000 + microSecond / 1000) << (12 + 10)) + (shardId << 10) + seq;

在redis-id-generator-java目录下,有example和benchmark代码,提供了 Java客户端生成模式,其它语言只要支持redis evalsha命令就可以了。

MongoDB的ObjectId

Mongodb集合中的每个document中都必须有一个"_id"键,这个键的值可以是任何类型的,在默认的情况下是个Objectid对象。mongodb的ObejctId生产思想在很多方面挺值得我们借鉴的,特别是在大型分布式的开发,如何构建轻量级的生产,如何将生产的负载进行转移,如何以空间换取时间提高生产的最大优化等等。

欢迎加入我的星球

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

你不得不知的几个互联网ID生成器方案 的相关文章

随机推荐

  • RPA机器人成为金融银行业转型的重要推手

    当前 金融科技迅猛发展 金融业监管和合规要求不断提升 为了应对挑战 抓住机遇 银行业作为国民经济体系重要的组成部分和核心产业 早已开始探索科技赋能金融之路 当前银行业面临的难题 成熟的银行都会在其内部部署多个业务平台 管理系统 以实现业务流
  • arduino控制步进电机

    一 实物连接 二 代码实现 const int IN1 11 const int IN2 10 const int IN3 9 const int IN4 8 正转顺序 const char tab1 0x01 0x03 0x02 0x06
  • 【spring源码探索】一分钟搞懂RefreshScope的作用及实现原理

    前文 下述文章完全为个人阅读源码的随笔记录 如有错误 欢迎大家指出 过程 过程很坎坷 而且大家应该都不想看了吧 简而言之就是先写个测试DEMO 然后各种DEBUG 结论 这次先直接上结论 然后再通过测试DEMO给出验证 最后再去跟代码 Re
  • 怎样在Android访问php取回json数据

    1 代码 php代码 1 array array 2 username gt 杨铸 3 password gt 123456 4 user id gt 1 5 6 echojson encode array 2 代码 java代码 01 p
  • C语言算平均数,让用户输入一系列的正整数,输入-1表示输入结束,算出这些数字的平均数

    include
  • JAVA怎么替换html标签呢???

    之前遇见个需求 让我在下载文件时 把content里面的富文本存储的内容下载下来 但是又不能有html标签 那个我们怎们处理呢 废话不多说 上代码 StringBuffer stringBuffer new StringBuffer Str
  • Android10.0 Binder通信原理(七)-Framework binder示例

    Android取经之路 的源码都基于Android Q 10 0 进行分析 Android取经之路 系列文章 系统启动篇 Android系统架构Android是怎么启动的Android 10 0系统启动之init进程Android10 0系
  • 幸有一事,生死可许

    已然到了岁末 2014就要结束 迎来崭新的2015 颇多感慨 颇多难忘 与其说是2014年是我职业生涯中至关重要的一年 倒不如说是我人生道路上极为重要的一步来的更为贴切 这一年忙忙碌碌 一刻不得清闲 却是极为充实 没有迷茫 没有挣扎 有的只
  • httpclient发送Get请求和Post请求

    创建HttpClient发送请求 接收响应 Get请求简介 get无参数 get有参数 Post请求简介 post携带JSON参数 post携带表单参数 postman自动生成OKhttp代码 Get请求简介 1 创建HttpClient对
  • 华为交换机日常用巡检命令

    display version 查看设备允许版本 display startup 检查软件包 display licence 检查Licence信息 display patch information 检查补丁信息 display cloc
  • nrm安装后报错的解决办法(windows环境)

    安装 nrm npm install g nrm 运行nrm ls报错 配置系统环境变量 查询npm所在的路径 执行以下命令 其中prefix就是所需路径 npm config ls 新建系统环境变量 变量名 自己可定 只要与下一步添加时一
  • git解决冲突方法

    多人协作代码 若修改区域不是同一块很容易解决 场景描述 初始master上代码版本号为A 他人在本地修改后提交到master 版本号变为B 但此时我本地版本号仍是A 本地修改之后变为B 无法进行推送 解决方案 1 查看并创建分支 git b
  • Scala如何使用元组?用法代码实例

    Tuple是元素的集合 元组是异构的数据结构 也就是说 它们可以存储不同数据类型的元素 元组是不可变的 不像scala中的数组是可变的 存储整数 字符串和布尔值的元组的示例 val name 15 Chandan true 元组的类型由其所
  • pytorch函数详解

    pytorch函数详解 在typora这里写之后复制到简书上 1 torchvision 1 1 transforms Compose transforms 把几个转换组合 example from PIL import Image t t
  • k-均值(k-means)及Matlab动态实现

    k 均值 k means 及Matlab实现 注 1 仅适合于数值属性的数据 2 对正态分布 高斯分布 数据聚类效果最佳 1 算法思想 k means算法 也称k 均值算法 它把N个对象划分成k个簇 用簇中对象的均值表示每个簇的中心点 质心
  • 红黑树与平衡二叉树_奈学:红黑树(RedBlackTree)的概述

    1 AVL树与红黑树 AVL树是一种自平衡的二叉查找树 又称平衡二叉树 AVL用平衡因子判断是否平衡并通过旋转来实现平衡 它的平衡的要求是 所有节点的左右子树高度差不超过1 AVL树是一种高平衡度的二叉树 执行插入或者删除操作之后 只要不满
  • IAR EW for STM8 3.11.1汉化包汉化教程

    IAR EW for STM8 3 11 1汉化包汉化教程 汉化包下载地址 https me csdn net download u010210711 汉化教程直接将汉化包解压后复制到安装目录的bin文件夹 如 C Program File
  • C++ cstdlib – 概览

    什么是 C cstdlib C 标准库头文件 cstdlib in C 是 C 程序员使用最广泛的库头文件 它定义了一系列函数和宏 以实现跨团队 跨平台的高效且具有卓越表现的标准化 C 代码 C 是一种广受欢迎的程序语言 它能崛起的最初原因
  • HIMA F3330 984333002 伺服驱动模块

    运动控制 HIMA F3330 984333002 伺服驱动模块通常用于精确的运动控制应用 可以控制电机以特定速度和位置进行运动 位置反馈 HIMA F3330 984333002 伺服驱动模块可能支持位置反馈功能 以确保电机运动的准确性和
  • 你不得不知的几个互联网ID生成器方案

    服务化 分布式已成为当下系统开发的首选 高并发操作在数据存储时 需要一套id生成器服务 来保证分布式情况下全局唯一性 以确保系统的订单创建 交易支付等场景下数据的唯一性 否则将造成不可估量的损失 基于时间戳 比如流水号规则如下 XX YYY