当前位置: 首页 > 网络应用技术

掘金的文章ID是如何生成的?

时间:2023-03-08 10:51:27 网络应用技术

  在掘金中编写了许多文章后,我找到了掘金生成文章ID的密码。让我们看一下我最近发表的几篇文章的链接:

  2022-05-18 20:14 https://juejin.cn/post/709904834558927908

  2022-05-17 13:12 https://juejin.cn/post/70985687947458642222

  2022-05-16 23:58 https://juejin.cn/post/70983644238651428

  2022-05-15 15:58 https://juejin.cn/post/70978693333308637191

  2022-05-14 18:39 https://juejin.cn/post/709753827086925

  2022-05-13 23:37 https://juejin.cn/post/709724556776615454

  ... ... ...

  首先,我们发现掘金后端的路线简单明了,也就是说

  其次,本文的ID为19个数字;

  最后,随着时间的推移,ID的数量正在增加。

  经验丰富的朋友可能已经想到了 ^ - ^?

  如果您不知道,请一一听我的意见,欢迎您发表评论!

  首先,我选择从数据库的主要键开始。主键可以可以唯一地识别表中的记录,这对于数据表非常重要。当我们需要查询和参考表中的记录时,最好的方法是传递主键。

  在设计数据库设计时,建议尝试不使用业务领域,即作为与业务相关的主要关键,因为作为项目设计的技术人员,我们通常无法预测一生中哪个业务领域将是哪个业务领域该项目的周期。存在重复或可重复使用的情况。

  因此,您将设计一个ID作为主要键,并将自我提示限制到该字段。如果您以这种方式设计,那么普通小型应用程序将不会出现重大问题。

  但是,对于分布式系统,数据库涉及多个数据库,并且不能依赖数据库来生成自我引入的ID,因为可以同时在不同的数据库上生成相同的ID。ID,我们需要将ID的ID放置在后端的逻辑中。

  在此之前,我在主数据库中聆听了一位老师以维护信息表,专门记录当前ID的最大值,然后每次添加ID时从数据库中获取主数据库的最大值此基础过程需要用于防止误解。该解决方案确实可以解决冲突问题,但是我认为维持数据一致性的锁可能无法满足高并发状况和低延迟的状况。

  那么,在进行数据库设计之前,您需要如何考虑?以下是ID的一般要求:

  那么,行业中有哪些成熟的ID可以满足上述要求?一个是,另一个是(雪花算法)。

  标准类型包含32个十六进制的数字,分为五个带有连接器的阶段。表格为32个字符。示例:630E450A-ABCB-435C-CBA6-22330000000000000000

  优势:

  1)简单,方便的代码。

  2)ID的性能非常好,基本上没有性能问题。

  3)世界上独特的,在遇到数据迁移,系统数据合并或数据库更改的情况下,可以平静地应对。

  UUID的性能非常高:本地一代,没有网络消耗,如果您只认为唯一的UUID还可以。但是

  缺点:

  1)没有分类,趋势正在增加。无法预测他的生成顺序并且无法产生有序的数字。

  2)分布式ID通常用作主要密钥。UUID太长,存储空间相对较大。如果是大量数据库,则有必要考虑存储量的问题。

  3)UUID通常存储在字符串中,并且查询效率相对较低。

  4)数据传输量很大,无法读取。

  5)索引,B+树索引分开。由于分布式ID是主要键,主键包含索引,然后通过B+树实现mySQL的索引,因为UUID数据是无序的。每个新的UUID数据插入。为了查询优化,索引将是索引的索引。“基础B+树是修改的。这不是很好。插入完全不当,这不仅会导致某些中间节点分裂,还会导致一些中间节点创建许多徒劳的不饱和节点,从而大大降低了数据库插入性能。

  变体UUID

  1)为了求解UUID非可读方法,您可以将UUID用于INT64方法。

  2)为了解决UUID的无序问题,NHIBERNATE在其主要密钥生成方法中提供了组合的GUID/TIMESTAMP。保留GUID的10个字节,并使用6个字节代表GUID时间(DateTime)

  全球是独一无二的,时间正在以有序的方式增加,同时,它占用更少的空间。生成的ID仅为19位塑料编号。它非常适合MySQL的Bigint数据类型,这是完美的。

  数据结构:

  因为二进制中的最高位是符号,所以1表示负数,0表示正数。生成的ID通常用于整数,因此最高位固定为0。

  用于记录时间戳,毫秒。可以表示的值范围是从0计算的,而不是1.其他单词,41位数字可以表示2^(41)-1毫秒-1毫秒,单位的年份为(2“ 41)-1)/(1000“ 60-24” 365)= 69年。

  它用于记录工作机ID。它可以在2^(10)= 1024个节点上部署,包括5个数据学和5位数字。Workerld5bit可以代表的最大正整数为245-1 = 31,也就是说,您可以使用32个数字0 0,1,2,3 ... 31代表不同的DateCenterld或工人。

  序列号用于记录在同一毫秒中生成的不同ID。12位可以代表的最大正整数为2^(12)-1 = 4095,即4095的4095数字为0,1.2。3.4094sessence

  雪花可以保证所有生成的ID按时间增加,并且在整个分布式系统中不会产生重复的ID(因为有数据中心和workerld可以区分)

  优势:

  (1)高性能高可用性:生成时不依赖数据库,并在内存中完全生成。

  (2)大容量:每秒都可以生成数百万个自我信息ID。

  (3)ID的自我提示:保存在数据库中,索引效率很高。

  缺点:

  依赖关系和系统时间的一致性,如果恢复或更改了系统时间,则可能导致ID冲突或重复。

  现在,您应该知道为什么掘金生成的文章ID为19位数字,尤其是MySQL的Bigint类型,这非常友好。

  如果您想知道如何在GO语言中实施雪花算法,请阅读我的下一篇文章:Snowflake算法生成主要密钥ID |青年训练营说明

  原始:https://juejin.cn/post/709936681562878748