雪花算法

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 分配机制。

posted @   chuangzhou  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源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
点击右上角即可分享
微信分享提示