高并发下的唯一ID生成算法-雪花算法 | 青训营笔记

326 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 6 天

项目分析

本次的后端大项目,抖音极简版的原型抖音在实际应用中因其极其庞大的用户数量可能存在在短时间内出现数量巨大的用户注册以及视频投稿请求,此时如果单单依靠MySQL来为用户信息分配相应的主键-唯一ID,效率较低。这时如何通过在内存中生成可以标识视频与用户的唯一ID主键,便显得至关重要。

生成ID的相应要求

ID生成规则部分的必须要求

  1. 唯一性:不能出现重复的ID,确保ID与其所对应结构体的一对一关系;
  2. 有序性:由于MySQL的引擎使用的是聚集索引,且由于RDBMS使用的是Btree来进行数据存储,因此我们应该使用有序的ID来保证数据输入,即越后创建的ID越大;
  3. 安全性:对于连续的ID,便可以通过顺序下载制定URL来获得相应的URL,因此不规则、不连续的ID更加安全;
  4. 信息性:包含时间戳等有用信息。

数据库自增主键的缺点

  1. 不利于扩容;
  2. 生出ID为连续的

雪花算法

算法特点

雪花算法由Twitter研发,其可以在一秒内产生26万个自增可排序的ID,其具有以下几个特点:

  1. 根据ID创建时间有序生成ID;
  2. SnowFlake生成一个64bit整数,可以存储足够多的用户数量;
  3. 在分布式系统中不会产生ID碰撞,其效率较高。

号段表示

  1. 1bit最高位基本为0
  2. 4bit-时间戳,记录ID生成时间
  3. 10bit-工作机器ID,记录工作机器ID
  4. 12bit-序列号,标识同一时间内的不同ID

注意

雪花算法是一种依赖于创建时间戳的算法,因而在系统时间变化、调整时会应抛出异常避免产生重复、错误ID。

相应代码实现

https://github.com/twitter-archive/snowflake.git