雪花算法(SnowFlake)

本文探讨了Java中雪花算法生成的长整型ID的优点,如便于索引、避免数据重复和高效性,但也提及了时间戳限制、时间一致性问题和系统同步需求。关注点在于算法的工作原理和实际应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文不介绍原理,只介绍优缺点。

        据国家大气研究中心的查尔斯·奈特称,一般的雪花大约由10^19个水分子组成。在雪花形成过程中,会形成不同的结构分支,所以说大自然中不存在两片完全一样的雪花,每一片雪花都拥有自己漂亮独特的形状。雪花算法表示生成的id如雪花般独一无二。

  • 优点
  1. 在Java中生成的id是long类型的有序整数,相较uuid作为数据库的主键,更易用于索引搜索和排序,对数据库(MySQL B-Tree)友好。
  2. 所有id是根据时间递增的,无法根据其计算出业务量,避免被爬虫遍历数据。
  3. 生成id时,不依赖数据库不依赖外部服务,完全在内存中根据时间戳、工作机器id、序列号计算出。与数据库自增相比,数据的迁移合并实现可能性高。
  4. 整个系统中,不会产生重复id,对多服务分布式系统有这种需求时可用。如果数据库单表设置主键自增,是会出现id重复的情况。
  5. 高效,每秒可生产数十万id。
  • 缺点
  1. id的时间戳部分只能表示69年,不过一般一个系统也很难超过这个限制。
  2. 雪花算法依赖系统的时间一致性,如果系统时间被回调,可能会出现id重复导致主键冲突的情况。另外分布式系统中,各节点的时间并不能保证完全同步,所以有可能出现分布式系统中不能出现完全递增的情况。

感兴趣的同学可搜索下美团的Leaf。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值