雪花算法
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("t_user")
public class User {
private Long id;
private Integer uid;
private String name;
private String password;
}
首先在上面的代码,没有标注出来主键的注解 也就是@Table注解
结果就是
显而易见的,这里的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乱序。
主键生成策略:
IdTyper后可以跟的参数
最常用的就是 AUTO 自增
默认的就是ASSIGN_ID也就是雪花算法
ASSIGN_UUID(排除中划线的UUID)
如果使用IdType.ASSIGN_UUID策略,并重新自动生成排除中划线的UUID作为主键。主键类型为String,对应MySQL的表分段为VARCHAR(32)
这个UUID 也是一种分布式ID生成策略
INPUT 手动输入
无(无状态)
如果使用IdType.NONE策略,表示未设置主键类型(注解里等于跟随上下,左右里约等于INPUT)