@@ -98,7 +98,7 @@ COMMIT;
9898
9999如果我们可以批量获取,然后存在在内存里面,需要用到的时候,直接从内存里面拿就舒服了!这也就是我们说的 ** 基于数据库的号段模式来生成分布式 ID。**
100100
101- 数据库的号段模式也是目前比较主流的一种分布式 ID 生成方式。像滴滴开源的[ Tinyid] ( https://github.com/didi/tinyid/wiki/tinyid%E5%8E%9F%E7%90%86%E4%BB%8B%E7%BB%8D ) 就是基于这种方式来做的。不过,TinyId 使用了双号段缓存、增加多 db 支持等方式来进一步优化。
101+ 数据库的号段模式也是目前比较主流的一种分布式 ID 生成方式。像滴滴开源的[ Tinyid] ( https://github.com/didi/tinyid/wiki/tinyid原理介绍 ) 就是基于这种方式来做的。不过,TinyId 使用了双号段缓存、增加多 db 支持等方式来进一步优化。
102102
103103以 MySQL 举例,我们通过下面的方式即可。
104104
186186
187187除了高可用和并发之外,我们知道 Redis 基于内存,我们需要持久化数据,避免重启机器或者机器故障后数据丢失。Redis 支持两种不同的持久化方式:** 快照(snapshotting,RDB)** 、** 只追加文件(append-only file, AOF)** 。 并且,Redis 4.0 开始支持 ** RDB 和 AOF 的混合持久化** (默认关闭,可以通过配置项 ` aof-use-rdb-preamble ` 开启)。
188188
189- 关于 Redis 持久化,我这里就不过多介绍。不了解这部分内容的小伙伴,可以看看 [ JavaGuide 对于 Redis 知识点的总结 ] ( https://snailclimb.gitee.io/javaguide/#/docs/ database/Redis /redis-all ) 。
189+ 关于 Redis 持久化,我这里就不过多介绍。不了解这部分内容的小伙伴,可以看看 [ Redis 持久化机制详解 ] ( https://javaguide.cn/ database/redis /redis-persistence.html ) 这篇文章 。
190190
191191** Redis 方案的优缺点:**
192192
@@ -228,7 +228,7 @@ UUID.randomUUID()
228228
229229我们这里重点关注一下这个 Version(版本),不同的版本对应的 UUID 的生成规则是不同的。
230230
231- 5 种不同的 Version(版本)值分别对应的含义(参考[ 维基百科对于 UUID 的介绍] ( https://zh.wikipedia.org/wiki/%E9%80%9A%E7%94%A8%E5%94%AF%E4%B8%80%E8%AF%86%E5%88%AB%E7%A0%81 ) ):
231+ 5 种不同的 Version(版本)值分别对应的含义(参考[ 维基百科对于 UUID 的介绍] ( https://zh.wikipedia.org/wiki/通用唯一识别码 ) ):
232232
233233- ** 版本 1** : UUID 是根据时间和节点 ID(通常是 MAC 地址)生成;
234234- ** 版本 2** : UUID 是根据标识符(通常是组或用户 ID)、时间和节点 ID 生成;
@@ -270,10 +270,10 @@ Snowflake 是 Twitter 开源的分布式 ID 生成算法。Snowflake 由 64 bit
270270
271271![ Snowflake 组成] ( https://oss.javaguide.cn/github/javaguide/system-design/distributed-system/snowflake-distributed-id-schematic-diagram.png )
272272
273- - ** sign(1bit)** : 符号位(标识正负),始终为 0,代表生成的 ID 为正数。
274- - ** timestamp (41 bits)** : 一共 41 位,用来表示时间戳,单位是毫秒,可以支撑 2 ^41 毫秒(约 69 年)
275- - ** datacenter id + worker id (10 bits)** : 一般来说,前 5 位表示机房 ID,后 5 位表示机器 ID(实际项目中可以根据实际情况调整)。这样就可以区分不同集群/机房的节点。
276- - ** sequence (12 bits)** : 一共 12 位,用来表示序列号。 序列号为自增值,代表单台机器每毫秒能够产生的最大 ID 数(2^12 = 4096),也就是说单台机器每毫秒最多可以生成 4096 个 唯一 ID。
273+ - ** sign(1bit)** : 符号位(标识正负),始终为 0,代表生成的 ID 为正数。
274+ - ** timestamp (41 bits)** : 一共 41 位,用来表示时间戳,单位是毫秒,可以支撑 2 ^41 毫秒(约 69 年)
275+ - ** datacenter id + worker id (10 bits)** : 一般来说,前 5 位表示机房 ID,后 5 位表示机器 ID(实际项目中可以根据实际情况调整)。这样就可以区分不同集群/机房的节点。
276+ - ** sequence (12 bits)** : 一共 12 位,用来表示序列号。 序列号为自增值,代表单台机器每毫秒能够产生的最大 ID 数(2^12 = 4096),也就是说单台机器每毫秒最多可以生成 4096 个 唯一 ID。
277277
278278在实际项目中,我们一般也会对 Snowflake 算法进行改造,最常见的就是在 Snowflake 算法生成的 ID 中加入业务类型信息。
279279
@@ -299,10 +299,10 @@ Snowflake 是 Twitter 开源的分布式 ID 生成算法。Snowflake 由 64 bit
299299
300300![ UidGenerator 生成的 ID 组成] ( https://oss.javaguide.cn/github/javaguide/system-design/distributed-system/uidgenerator-distributed-id-schematic-diagram.png )
301301
302- - ** sign(1bit)** : 符号位(标识正负),始终为 0,代表生成的 ID 为正数。
303- - ** delta seconds (28 bits)** : 当前时间,相对于时间基点"2016-05-20"的增量值,单位:秒,最多可支持约 8.7 年
304- - ** worker id (22 bits)** : 机器 id,最多可支持约 420w 次机器启动。内置实现为在启动时由数据库分配,默认分配策略为用后即弃,后续可提供复用策略。
305- - ** sequence (13 bits)** : 每秒下的并发序列,13 bits 可支持每秒 8192 个并发。
302+ - ** sign(1bit)** : 符号位(标识正负),始终为 0,代表生成的 ID 为正数。
303+ - ** delta seconds (28 bits)** : 当前时间,相对于时间基点"2016-05-20"的增量值,单位:秒,最多可支持约 8.7 年
304+ - ** worker id (22 bits)** : 机器 id,最多可支持约 420w 次机器启动。内置实现为在启动时由数据库分配,默认分配策略为用后即弃,后续可提供复用策略。
305+ - ** sequence (13 bits)** : 每秒下的并发序列,13 bits 可支持每秒 8192 个并发。
306306
307307可以看出,和原始 Snowflake(雪花算法)生成的唯一 ID 的组成不太一样。并且,上面这些参数我们都可以自定义。
308308
@@ -374,9 +374,9 @@ IdGenerator 生成的唯一 ID 组成如下:
374374
375375![ IdGenerator 生成的 ID 组成] ( https://oss.javaguide.cn/github/javaguide/system-design/distributed-system/idgenerator-distributed-id-schematic-diagram.png )
376376
377- - ** timestamp (位数不固定)** : 时间差,是生成 ID 时的系统时间减去 BaseTime(基础时间,也称基点时间、原点时间、纪元时间,默认值为 2020 年) 的总时间差(毫秒单位)。初始为 5bits,随着运行时间而增加。如果觉得默认值太老,你可以重新设置,不过要注意,这个值以后最好不变。
378- - ** worker id (默认 6 bits)** : 机器 id,机器码,最重要参数,是区分不同机器或不同应用的唯一 ID,最大值由 ` WorkerIdBitLength ` (默认 6)限定。如果一台服务器部署多个独立服务,需要为每个服务指定不同的 WorkerId。
379- - ** sequence (默认 6 bits)** : 序列数,是每毫秒下的序列数,由参数中的 ` SeqBitLength ` (默认 6)限定。增加 ` SeqBitLength ` 会让性能更高,但生成的 ID 也会更长。
377+ - ** timestamp (位数不固定)** : 时间差,是生成 ID 时的系统时间减去 BaseTime(基础时间,也称基点时间、原点时间、纪元时间,默认值为 2020 年) 的总时间差(毫秒单位)。初始为 5bits,随着运行时间而增加。如果觉得默认值太老,你可以重新设置,不过要注意,这个值以后最好不变。
378+ - ** worker id (默认 6 bits)** : 机器 id,机器码,最重要参数,是区分不同机器或不同应用的唯一 ID,最大值由 ` WorkerIdBitLength ` (默认 6)限定。如果一台服务器部署多个独立服务,需要为每个服务指定不同的 WorkerId。
379+ - ** sequence (默认 6 bits)** : 序列数,是每毫秒下的序列数,由参数中的 ` SeqBitLength ` (默认 6)限定。增加 ` SeqBitLength ` 会让性能更高,但生成的 ID 也会更长。
380380
381381Java 语言使用示例:< https://github.com/yitter/idgenerator/tree/master/Java > 。
382382
0 commit comments