雪花算法
1. ID 结构(64 位)
雪花算法生成的 ID 是一个 64 位的长整型数字,由以下三部分组成:
组成部分 | 位数 | 说明 |
---|---|---|
时间戳 | 41 位 | 记录生成 ID 的时间(毫秒级),可用约 69 年(从 1970 年算起)。 |
机器 ID | 10 位 | 支持最多 1024 台机器(如 5 位数据中心 ID + 5 位机器 ID)。 |
序列号 | 12 位 | 同一机器同一毫秒内的自增序号,每毫秒最多生成 4096 个 ID。 |
2. 核心优势
- 唯一性:通过时间戳 + 机器 ID + 序列号组合保证全局唯一。
- 有序性:ID 按时间戳递增,适合作为数据库主键(如 MySQL InnoDB 的 B+树索引)。
- 高性能:本地生成,无网络或数据库调用,每秒可生成百万级 ID。
- 轻量级:无需依赖 Redis、ZooKeeper 等外部服务。
3. 典型应用场景
- 分布式系统主键(如订单 ID、用户 ID)。
- 数据库分库分表时的全局唯一标识。
- 日志追踪、消息队列等需要有序唯一 ID 的场景。
4. 实现伪代码逻辑
class Snowflake:
def __init__(self, machine_id):
self.machine_id = machine_id # 机器 ID
self.sequence = 0 # 序列号
self.last_timestamp = 0 # 上次生成时间戳
def generate_id(self):
current_timestamp = self.get_current_timestamp()
if current_timestamp < self.last_timestamp:
raise Exception("时钟回拨!")
if current_timestamp == self.last_timestamp:
self.sequence += 1
if self.sequence >= 4096: # 序列号溢出,等待下一毫秒
current_timestamp = self.wait_next_millis()
self.sequence = 0
else:
self.sequence = 0
self.last_timestamp = current_timestamp
# 组合生成 ID
return (current_timestamp << 22) | (self.machine_id << 12) | self.sequence
5. 注意事项
- 时钟回拨问题:若机器时钟发生回拨(如人工调整时间),可能导致 ID 重复。
解决方案:- 记录最近一次时间戳,检测到回拨时抛出异常或等待时钟同步。
- 使用扩展算法(如美团的 Leaf、百度的 UidGenerator)优化时钟容错。
- 机器 ID 管理:需确保不同机器的 ID 不重复(可通过配置中心或数据库分配)。
6. 与其他算法的对比
算法 | 优点 | 缺点 |
---|---|---|
雪花算法 | 高性能、有序、无中心化 | 依赖系统时钟,需处理时钟回拨 |
UUID | 简单、无冲突风险 | 无序、存储空间大(128 位) |
数据库自增 ID | 绝对有序、简单 | 性能低、扩展性差(分库分表时需改造) |
Redis 自增 | 高性能 | 依赖 Redis、单点故障风险 |
总结
雪花算法是分布式系统中生成唯一 ID 的高效方案,适用于高并发、需要有序 ID 的场景。实际使用时需结合业务需求优化时钟回拨处理和机器 ID 分配机制。
本文来自博客园,作者:chuangzhou,转载请注明原文链接:https://www.cnblogs.com/czzz/p/18697766
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2024-02-03 JAVA8 - 异步编程
2023-02-03 sublime - pretty json
2022-02-03 bytes()
2022-02-03 对象表示形式
2022-02-03 f-string