生成唯一序列号 Unique ID

生成唯一序列号 Unique ID程序取号的锁竞争和网络延迟是不可避免的 所以最理想的 UniqueID 策略还是本地生成 把发号器内嵌到每个程序中 同时保证生成标准的同步

         唯一的序列号Unique ID,在程序的各个方面都有所应用,特别是数据存储方面。很多数据库都需要一个自增的唯一的序列号作为Primary Key。

 

         最简单的Unique ID就是在内存中维护一个long序列,每次取用的时候做i++。这是最简单的UniqueID,在单线程程序中适用。

         随着盘子越做越大,架构和程序会引入各种新的特性,这时候需要重新考虑Unique ID的维护:

         引入多线程,取数的时候就会出现线程竞争,这时候需要通过加锁来保证ID的唯一性,可以使用AtomicLong来解决冲突和一致性的问题。

         引入多进程,原来放在同一个程序内存的Unique ID会变得不适用,只能往外迁,通过一个单独的进程来维护和提供服务。这时候,可以把维护Unique ID的任务交给数据库,数据库的Sequence就是充当这个角色。UniqueID大部分功能都是和数据捆绑在一起的,理所当然地可以把Unique ID的逻辑放到持久层。另外,为了降低数据库的压力,取Sequence可以按步长一次取一个范围。

         引入分布式,同理多进程,当需要在分布式系统中维护Unique ID,需要使用一个单独的服务来提供Unique ID的服务。系统数据的量级也大大提升,单独的数据库一般难以满足数据量的需求,需要做读写分离,分表分库等一系列的优化。这时候,数据库来维护Unique ID不仅需要兼顾本身集群的特性,还要应对大数量的并发请求,难免会造成性能的下降。

         所以,通过一个单独的服务来创建和维护Unique ID(一般称为发号器),是非常有必要的。把Unique ID的逻辑分离出去,也便于数据库系统的伸缩扩展。当然,为了提高发号器的效率,减少网络的延迟,通常会按照不同数据中心不同机房来单独部署。同时,要做好各个发号器间的同步,例如以时间为生成标准,则需要同步时间。

         可是,程序取号的锁竞争和网络延迟是不可避免的,所以最理想的Unique ID策略还是本地生成把发号器内嵌到每个程序中,同时保证生成标准的同步

 

         对于小规模应用,维护UniqueID很简单。接下来主要讨论,分布式系统中Unique ID的维护逻辑。综上所述,处理策略主要分三个方向:

借助第三方:数据库,Redis

单独服务:发号器(Weibo,Twitter的SnowFlake)

本地生成:UUID

         这里主要考虑点:发号器的性能和高可用性。ID的长度,用64bit的一个long来存储是最合适的(UUID的128bit就太长了),符合操作系统的处理,但是长度有限,很难把完全唯一的信息都存进去。

具体的分析过程和策略可以参考《Unique ID的特性需求分析》和《Unique ID策略》。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/199021.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午2:01
下一篇 2026年3月26日 下午2:02


相关推荐

  • Object 转 List 工具类

    Object 转 List 工具类publicstatic T List T castList Objectobj Class T clazz List T result newArrayList T if objinstanceo for Objecto List obj r T T T T T

    2026年3月17日
    3
  • 10个精致的企业网站设计模板欣赏及点评

    10个精致的企业网站设计模板欣赏及点评以下的 10 个网页设计作品是 ThemeForest 上最受欢迎的优秀企业网站设计模板的其中一小部分 它们风格低调沉稳 几乎只使用黑白灰三种色彩 却不雷同 并且在细节上都非常讲究 ThemeForest 是非常值得网页设计师关注的高品质网站 其上的几乎每一个设计模板都称得上是杰出的设计作品 值得我们认真揣摩学习 这篇文章里我将根据自己的观点对这 10 个设计模板的设计思路和方法做一总结 列出其中的要点 挖掘值

    2026年3月26日
    2
  • python字符串转换成数字_python 字符与数字如何转换[通俗易懂]

    展开全部一、python中字符串转换成数字1、类中进行导入:importstring,str=’555’,num=string.atoi(str),num即为str转换成的数字转换为浮点数:string.atof(str)2、直接62616964757a686964616fe59b9ee7ad9431333365666261intint(str)即可。二、数字转换成字符串num=322,str…

    2022年4月18日
    89
  • Unity Shader学习一:矢量的点积和叉积

    Unity Shader学习一:矢量的点积和叉积矢量的点积点积的名称来源于这个运算的符号 a b 中间这个圆点符号是不可省略的 在 UnityShader 中 可以直接使用形如 dot a b 的代码来对两个矢量进行点积的运算 点积的公式由两种形式第一种 两个三维矢量的点积是把两个矢量对应分量相乘然后再取和 最后的结果是一个标量 公式为 a b ax ay az bx by bz axbx ayby azbz 矢量的点积满足交换律 即 a b b a 点积的几何意义很重要 因为点积几乎应用到了图形学的各个

    2025年9月27日
    4
  • python-PyPDF2

    python-PyPDF2作用:处理PDF文档提取文本,旋转页面,叠加页面1.pdfFileObj=open(‘meetingminutes.pdf’,’rb’)#打开pdf文档2.pdfReader=PyPDF2.PdfFileReader(pdfFileObj)#获取pdf文档数据3.pdfReader.numPages#获取页数4.pageObj=pdfReader.getPage(0)#获取指定页码的内…

    2022年6月23日
    35
  • 怎么git 自己建的服务器_如何搭建自己的git服务器「建议收藏」

    怎么git 自己建的服务器_如何搭建自己的git服务器「建议收藏」前几天在服务器亲自搭建git服务器,之前只是我自学了git的知识,在网上找了很多资料,重装了很多次,都不知道怎么使用,最后自己研究了好几遍,终于把git服务器搭建起来了。但是不知道我这种方法对不对,分享出来,希望大家指正。安装git$yuminstallcurl-develexpat-develgettext-developenssl-develzlib-develperl-dev…

    2026年4月17日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号