分布式系統唯一ID生成方案匯總:分布式系統唯一ID生成方案匯總
1 雪花算法
snowflake是Twitter開源的分布式ID生成算法,結果是一個long型的ID。其核心思想是:使用41bit作為毫秒數,10bit作為機器的ID(5個bit是數據中心,5個bit的機器ID),12bit作為毫秒內的流水號(意味着每個節點在每毫秒可以產生 4096 個 ID),最后還有一個符號位,永遠是0。可以保證幾乎全球唯一!
2 主鍵自增測試
在User實體類字段上 加 @TableId(type = IdType.AUTO)注解
src/main/java/com/lv/mybatis_plus/pojo/User.java
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
//對應數據庫的主鍵(uuid,自增id,雪花算法,redis,zookeeper!)
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private String email;
}
修改數據庫id字段一定要自動遞增
再次運行測試類中的插入方法,然后查看數據庫新增字段
id字段實現了自增
3 手動輸入主鍵測試
修改User實體類的 @TableId(type = IdType.INPUT)注解
src/main/java/com/lv/mybatis_plus/pojo/User.java
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
//對應數據庫的主鍵(uuid,自增id,雪花算法,redis,zookeeper!)
@TableId(type = IdType.INPUT) //一旦手動輸入id之后,就需要自己寫id了
private Long id;
private String name;
private Integer age;
private String email;
}
此時運行插入測試方法,查看控制台日志
可以看出id為null,我們沒有給id傳值,此時查看一下數據庫
因為我們給數據庫中的主鍵設置自動遞增了,所有數據還是插入進去了,那么接下來我們修改一個測試類,給id傳入一個值再測試一次
src/test/java/com/lv/mybatis_plus/MybatisPlusApplicationTests.java
//測試插入
@Test
public void testInsert(){
User user = new User();
user.setId(9527L);//傳入一個Long類型的id
user.setName("星露谷");
user.setAge(8);
user.setEmail("1148397597@qq.com");
int result = userMapper.insert(user); // mybatis-plus會幫我們自動生成id
System.out.println(result); //受影響的行數
System.out.println(user); //發現,id會自動回填
}
運行插入方法,查看控制台和數據庫
數據插入成功
4 所有主鍵生成策略
只需要修改實體類上@TableId(type = ???)注解 中的type值即可,默認 ID_WORKER 全局唯一的id
AUTO(0), //數據庫id自增
NONE(1), //未設置主鍵
INPUT(2), //手動輸入
ID_WORKER(3), //默認的全局唯一id
UUID(4), //全局唯一uuid
ID_WORKER_STR(5); //ID_WORKER 的字符串表示法
其它策略這里就不再測試了