本文不介绍原理,只介绍优缺点。
据国家大气研究中心的查尔斯·奈特称,一般的雪花大约由10^19个水分子组成。在雪花形成过程中,会形成不同的结构分支,所以说大自然中不存在两片完全一样的雪花,每一片雪花都拥有自己漂亮独特的形状。雪花算法表示生成的id如雪花般独一无二。
- 优点
- 在Java中生成的id是long类型的有序整数,相较uuid作为数据库的主键,更易用于索引搜索和排序,对数据库(MySQL B-Tree)友好。
- 所有id是根据时间递增的,无法根据其计算出业务量,避免被爬虫遍历数据。
- 生成id时,不依赖数据库不依赖外部服务,完全在内存中根据时间戳、工作机器id、序列号计算出。与数据库自增相比,数据的迁移合并实现可能性高。
- 整个系统中,不会产生重复id,对多服务分布式系统有这种需求时可用。如果数据库单表设置主键自增,是会出现id重复的情况。
- 高效,每秒可生产数十万id。
- 缺点
- id的时间戳部分只能表示69年,不过一般一个系统也很难超过这个限制。
- 雪花算法依赖系统的时间一致性,如果系统时间被回调,可能会出现id重复导致主键冲突的情况。另外分布式系统中,各节点的时间并不能保证完全同步,所以有可能出现分布式系统中不能出现完全递增的情况。
感兴趣的同学可搜索下美团的Leaf。