雪花算法

  1. @Data
  2. @AllArgsConstructor
  3. @NoArgsConstructor
  4. @TableName("t_user")
  5. public class User {
  6. private Long id;
  7. private Integer uid;
  8. private String name;
  9. private String password;
  10. }

首先在上面的代码,没有标注出来主键的注解 也就是@Table注解
结果就是
image.png
显而易见的,这里的id并不是数据库中设置的自增的主键
经过了解 这个是

Twitter的分布式雪花算法 SnowFlake 每秒自增生成26个万个可排序的ID

这是推特开源的分布式ID生成算法,结果是一个long类型的ID,核心思想是:
使用41bit最为毫秒数,10 bit作为机器的ID(5个bit是数据中心,5个bit是机器的id),
12bit作为毫秒内的流水号,意味着每个节点在每毫秒可以生成(4096)个ID,最后还有一个符号位,
永远是0,保证几乎全球唯一。
其中 10位的机器id 可以再同一毫秒产生的id数:1024*4096个
优点:
1.生成ID时不依赖于DB,完全在内存生成,高性能高可用。
2.ID呈趋势递增,后续插入索引树的时候性能较好。
缺点:依赖于系统时钟的一致性。如果某台机器的系统时钟回拨,有可能造成ID冲突,或者ID乱序。

主键生成策略:
image.png
IdTyper后可以跟的参数
最常用的就是 AUTO 自增
默认的就是ASSIGN_ID也就是雪花算法

ASSIGN_UUID(排除中划线的UUID)

如果使用IdType.ASSIGN_UUID策略,并重新自动生成排除中划线的UUID作为主键。主键类型为String,对应MySQL的表分段为VARCHAR(32)
这个UUID 也是一种分布式ID生成策略

INPUT 手动输入

自己写ID

无(无状态)

如果使用IdType.NONE策略,表示未设置主键类型(注解里等于跟随上下,左右里约等于INPUT)