【算法】生成分布式 ID 的雪花算法

雪花算法是一种由Twitter发明的分布式ID生成策略,用于保证全局唯一性。它由时间戳、机器ID和序号三部分组成,能应对分布式系统中的ID需求,但在机器时间不准确时可能产生冲突。国内的UidGenerator和Leaf对此进行了优化并开源。
摘要由CSDN通过智能技术生成

ID 是数据的唯一、不变且不重复的标识,在查询数据库的数据时必须通过 ID 查询,在分布式环境下生成全局唯一的 ID 是一个重要问题。

雪花算法(snowflake)是一种生成分布式环境下全局唯一 ID 的算法,该算法由 Twitter 发明,用于推文 ID 的生成。国内百度的 UidGenerator,美团的 Leaf 对雪花算法进行了优化,也都在 GitHub 上开源了。

一、为什么需要分布式 ID

在单机场景下,我们对 ID 的要求通过 MySQL 的主键自增就可以满足。
但随着系统数据量、并发压力的增加,原本的单机环境无法满足,需要对 MySQL 进行分库分表,对服务器进行分布式部署。此时,仅仅依靠 MySQL 的主键自增就有问题了。假设现在扩至两台数据库服务器,每台服务器的表 table1 上的 ID 都从 1 开始自增,此时就存在 ID 冲突了。当查询表 table1 中 ID = 234 的数据时,无法确定是哪一台服务器上的 ID。

在这里插入图片描述

在分布式环境下,数据遍布在不同服务器上的数据库中,此时我们如何为不同的数据生成全局唯一的主键呢?
答案就是:使用分布式 ID

二、雪花算法的实现

雪花算法生成的 分布式 ID 由四部分组成:

  1. 第一个 bit,恒为 0。
  2. 第 2 ~ 42 个bit,表示时间戳,单位是毫秒
  3. 第 43 ~ 52 个bit,表示机器 ID,最多 1024 个机器节点,这部分可以根据业务不同做修改。
  4. 第 53 ~ 64 个bit,表示序号,即某台机器在这一毫秒内生成的 ID 的序号。可以用这 12 位 bit 区分一毫秒内生成的 ID,最多区分 4096 个不同 ID。

那么在 1ms 时间内,最多可以生成 1024 x 4096 = 4194304 个 ID。

雪花算法的优点自不必多说,生成速度快,可灵活修改,生成 ID 有序递增等。

同时它的显著缺点就是需要解决重复 ID 问题,因为它依赖时间,当机器时间不准时,就可能出现 ID 冲突。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值